繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM