在SAS PROC FREQ中,使用带有多个条件的WHERE语句,我想了解为什么添加条件会导致频率增加。
第一个实例:
PROC FREQ;
WHERE X=1 AND Y=1;
TABLE YEARS;
RUN;
输出特定年份的N = 100。
但是:
PROC FREQ;
WHERE (X=1 AND Y=1) AND A=2 OR B=2;
TABLE YEARS;
RUN;
输出的N值大于前一年的WHERE,例如N = 200。
在第二个FREQ和WHERE语句中,我认为应该首先对括号中的条件进行求值,然后再执行AND ... OR,并应选择与第一个WHERE语句相同的N = 100。然后,该行中的其余条件AND A = 2或B = 2,应选择A = 2或B = 2的N = 100的子集。因此,选择的N应该小于或等于100,但不大于100。
这就是我想要的-(X = 1 AND Y = 1)的子集 也有A = 2或B = 2--但似乎不是我要的。有建议吗?
这是我想要的正确说法吗?
WHERE (X=1 AND Y=1 AND A=2) OR (X=1 AND Y=1 AND B=2);
谢谢。
答案 0 :(得分:3)
向逻辑表达式中添加未嵌套 OR
总是会导致结果集保持不变或变大。
您需要括号来更改评估顺序。如果没有括号,将首先计算所有and
表达式,然后计算or
表达式
摘自文档Combining Expressions By Using Logical Operators
处理复合表达式
当SAS遇到化合物WHERE时 表达式(多种条件)时,软件遵循以下规则 确定评估每个表达式的顺序。何时何地 表达式组合在一起,SAS处理特定条件 订单:
- 首先处理NOT表达式。
- 然后处理与AND连接的表达式。
- 最后,处理由OR联接的表达式。
使用括号控制评估顺序
即使SAS按特定顺序评估逻辑运算符,您也可以 通过将表达式嵌套在括号中来控制求值顺序。 也就是说,括号中的表达式在一个 没有封闭。括号内最里面的表达式 首先处理,然后再进行最深处理,向外移动直到 所有括号均已处理。
例如,假设您想要一个 同时具有SAS / GRAPH和SAS / STAT的所有加拿大站点的列表 软件,因此您发出以下表达式:
where product='GRAPH' or product='STAT' and country='Canada';
但是,结果包括所有许可SAS / GRAPH软件的站点以及加拿大 许可SAS / STAT软件的站点。为了获得正确的结果, 您可以使用括号,这会使SAS评估比较 首先在括号内,提供包含以下内容的网站列表: 产品许可证,然后将结果用于剩余条件:
where (product='GRAPH' or product='STAT') and country='Canada';
所以你
WHERE (X=1 AND Y=1) AND A=2 OR B=2;
与
相同WHERE (X=1 AND Y=1 AND A=2) OR B=2;
您的这就是我想要的在问题中描述的是
WHERE (X=1 AND Y=1) AND (A=2 OR B=2);
这是相同的(distributive law of logic)
WHERE (X=1 AND Y=1 AND A=2) OR (X=1 AND Y=1 AND B=2);
无论您如何表达表达式,添加OR
总是可以增加满足表达式的项目数量。未嵌套的OR
可以选择比嵌套{或括号括起来的OR