SAS PROC SQL中Select含case语句致Group By失效出现重复行问题咨询
SAS PROC SQL 包裹CASE后GROUP BY失效问题修复方案
问题原因
你遇到的重复行问题是因为CASE语句中引用了未加入GROUP BY子句的行级字段a.NumericVariable。SAS PROC SQL的默认规则是:当SELECT子句同时存在分组聚合函数和未分组的非聚合字段时,会自动执行*重合并(remerge)*操作,先计算分组聚合结果,再将结果拼接回每一行原始数据,最终返回行数和未分组的JOIN结果行数一致,就出现了大量重复行。
你移除CASE语句后,SELECT子句仅包含分组字段和聚合函数,因此可以正常返回分组聚合后的结果,没有重复。
修复代码
如果你的业务逻辑和原始代码一致:只要对应分组内存在至少一行NumericVariable非缺失,就返回该分组的Max(0,Sum(Var4)-Sum(Var5))结果,否则返回空,只需要将CASE中的行级字段判断改为分组级聚合判断即可,调整后代码如下:
PROC SQL; create table example as select a.var1, a.var2, a.var3, case when max(a.NumericVariable) is not missing then Max(0,Sum(a.Var4) - Sum(a.Var5)) end as Calculation from table1 a inner join table2 b on a.primarykey=b.primarykey group by var1,var2,var3; quit;
如果你的业务逻辑是仅将分组内NumericVariable非缺失的行的Var4、Var5计入总和,则可以将CASE逻辑放到聚合函数内部,代码如下:
PROC SQL; create table example as select a.var1, a.var2, a.var3, Max(0,Sum( case when a.NumericVariable is not missing then a.Var4 - a.Var5 else 0 end )) as Calculation from table1 a inner join table2 b on a.primarykey=b.primarykey group by var1,var2,var3; quit;
两种调整方案均避免了在聚合外引用未分组的行级字段,不会触发PROC SQL的重合并逻辑,最终返回的行数就是var1、var2、var3去重后的分组数。
内容的提问来源于stack exchange,提问作者thequadge
相关产品推荐
相关产品推荐

