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

proc sql code in SAS not filtering properly

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

此代码应执行以下操作:

-从 2 个不同的 table 中抓取列 - 只有 select 行不在特定日期 table 的第三行

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