[英]proc sql code in SAS not filtering properly
我希望这不是非常明显,但如果是,请不要杀了我,我在这方面真的很陌生,很难找到很多信息。
此代码应执行以下操作:
- 从 2 个不同的表中获取列 - 只有 select 行在特定日期不在第三个表中
proc sql;
create table DiallerExtra as
SELECT a.AGREEMENT_NUMBER,
b.CURRENT_FIRST_NAME,
b.TELEPHONE_NUMBER
FROM TABLE1 a, TABLE2 b
WHERE a.AGREEMENT_NUMBER
NOT IN (SELECT AgreementNumber
FROM TABLE3 (WHERE =(DeleteDate >= today()-1)))
;
quit;
我首先尝试了这个(如下),它可以很好地过滤结果(我最终只得到 15 行)。
proc sql;
create table DiallerExtra as
SELECT a.AGREEMENT_NUMBER
FROM TABLE1 a
WHERE a.AGREEMENT_NUMBER
NOT IN (SELECT AgreementNumber
FROM TABLE3 (WHERE =(DeleteDate >= today()-1)))
;
quit;
但是当我尝试第一个代码时,它似乎没有正确过滤,因为它吐出了 TABLE2 上的所有协议,这很多。
您的 NOT IN 逻辑的“过滤”不是问题。
加点东西告诉SQL如何合并TABLE1和TABLE2。
如果你想用 SQL 组合两个表,你需要告诉它如何匹配观察结果。 否则,表 1 中的每个观察结果都与表 2 中的每个观察结果相匹配。 在您的第一个示例中,即使 TABLE1 中只有一个值为 A.AGREEMENT_NUMBER 的观察值位于与您的 WHERE= 数据集选项匹配的 TABLE3 观察值中,它也会与 TABLE2 中的每个观察值匹配。 因此,如果 TABLE2 有 100 个客户,则结果集将有 100 个观察值。
因此,向您的 WHERE 语句添加另一个条件。 例如,如果 TABLE1 和 TABLE2 都有 AGREEMENT_NUMBER,那么您可能想要匹配它。
create table DiallerExtra as
SELECT a.AGREEMENT_NUMBER
, b.CURRENT_FIRST_NAME
, b.TELEPHONE_NUMBER
FROM TABLE1 a
, TABLE2 b
WHERE a.AGREEMENT_NUMBER = b.AGREEMENT_NUMBER
and a.AGREEMENT_NUMBER NOT IN
(SELECT AgreementNumber FROM TABLE3 (WHERE =(DeleteDate >= today()-1)))
;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.