如何在 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 标准不等于运算符是
<>
。
我对一个查询有疑问,我认为解决方案很简单,但我意识到事实并非如此。 我有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 标准不等于运算符是
<>
。