微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

SAS 中的 proc sql 代码未正确过滤

如何解决SAS 中的 proc sql 代码未正确过滤

我希望这不是一个非常明显的问题,但如果是,请不要杀我,我真的很新,很难找到很多信息。

代码应执行以下操作:

-从 2 个不同的表中抓取列 - 仅选择特定日期不在第三个表中的行

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)))
;

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。