Where、Having 和 OR 子句

时间:2021-03-03 17:16:14

标签: sql sas where-clause having proc-sql

我希望得到您的帮助! 我有一组已批准、拒绝、未完成等交易。 我需要获取最新的交易(由于交易重复;它们仅在批准/拒绝/等状态上有所不同),但如果我们需要保持所有批准(一笔交易可以批准两次,我们需要查看)。 任务:我需要保留所有“已批准”的交易,然后只保留最新的(来自其余结果)。并非所有交易都具有已批准状态。一笔交易可以有 2 个批准,而另一笔交易可以有拒绝和拒绝(在这种情况下,我需要最新的拒绝)。

这不起作用:

proc sql;
    create table XYZ as 
    select * 
    from MKZ
    where approve_decline='Approve'
    group by Trans_id_proxy 
    or (having datetimevar=max(datetimevar)) 
    order by account_number
;
quit;

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您使用的是 SAS,那么这不是 proc sql 的任务,而是数据步骤的任务。 PROC SQL 不太擅长这种逐行考虑,尤其是在顺序方面 - 可以在 SQL 中进行,但要复杂得多。

就您做错了什么而言 - 首先,您实际上并不想要 group by,这会折叠行;您想选择单个行。 Having 也不是你可以嵌入到其他东西中的东西 - wherehaving 是分开的,where 在 group by 之前(因此,过滤输入记录)和 { {1}} 在 group by 之后(过滤输出记录)。

在数据步骤中,这非常快。

having

我不确定我的 proc sort data=mkz out=mkz_sort; by account_number trans_id_proxy datetimevar; run; data xyz; set mkz_sort; by account_number trans_id_proxy; if (last.trans_id_proxy) or (approve_decline='Approve'); run; 是否正确,因为不清楚您打算如何将这些分组,但我假设 by 是主要的分组依据,而 {{1 }} 是次要的 - 你在 SQL 中不会这样做,所以也许你的意思是别的。只需在 account_number 末尾加上 trans_id_proxy,然后在它之前添加任何您想作为分组操作的变量。