如何在 SAS 中排除具有多个条件和 "not in" 的行?

How to exclude rows with multiple conditions and "not in" in SAS?

我对一个查询有疑问,我认为解决方案很简单,但我意识到事实并非如此。 我有table A,cod字段是主键。

化学需氧量 类别 产品 IND 来源
1 两个 黑色 Y ANEXO8
2 两个 黑色 Y ANEXO8
3 两个 黑色 N ANEXO8
4 两个 红色 Y ANEXO8
5 两个 红色 Y ANEXO8
6 两个 红色 N ANEXO8
7 两个 黄色 Y ANEXO8
8 两个 黄色 N ANEXO8
9 两个 绿色 N ANEXO8
10 两个 绿色 N ANEXO8
11 两个 粉色 Y ANEXO8
12 两个 粉色 Y ANEXO8
13 两个 粉色 N ANEXO8
14 两个 灰色 N SAS
15 两个 灰色 N SAS
16 两个 灰色 N SAS

我想要得到的是首先过滤掉所有具有字段“ANEXO8”的行,然后排除所有具有字段 PRODUCTequal 为“黑色”的行,最后排除所有具有该字段的行仅当字段 IND 等于“Y”时,产品才等于“红色”。

结果 table 将等于:

化学需氧量 类别 产品 IND 来源
6 两个 红色 N ANEXO8
7 两个 黄色 Y ANEXO8
8 两个 黄色 N ANEXO8
9 两个 绿色 N ANEXO8
10 两个 绿色 N ANEXO8
11 两个 粉色 Y ANEXO8
12 两个 粉色 Y ANEXO8
13 两个 粉色 N ANEXO8
14 两个 灰色 N SAS
15 两个 灰色 N SAS
16 两个 灰色 N SAS

我尝试执行单个查询:

proc sql;
   create table test as                                                                            
   select * from A 
   where SOURCE = "ANEXO8" 
   and PRODUCT not in ("black")
   and (PRODUCT not in ("red") and IND ne "Y"));
run;

但我没有得到我想要的结果,你知道我能做什么吗,或者我哪里错了?

试试这个

proc sql;
   create table test as                                                                            
   select * from A 
   where SOURCE = "ANEXO8" 
   and PRODUCT not in ("black")
   and not (PRODUCT in ("red") and IND = "Y"));
run;

你必须小心括号实际上是如何影响否定的

你的逻辑很接近,但最后一个 and 应该是 or:

create table test as                                                                            
   select * from A 
   where SOURCE = 'ANEXO8' and 
         PRODUCT <> 'black' and
         (PRODUCT <> 'red' or IND <> 'Y');

这只是一个逻辑错误。请注意其他差异:

  • NOT IN 当“不等于”就足够时,似乎已经结束了。
  • SQL 标准字符串分隔符是单引号而不是双引号。
  • SQL 标准不等于运算符是 <>