如何在SAS Proc SQL中复现Tableau FIXED函数并解决子查询多行报错
问题原因
你当前子查询未关联外层查询的ID_Field和Group字段,会返回所有分组的最大值结果,外层单行无法匹配多个返回值,因此触发多行报错。
解决方案
方案1:关联子查询写法(适合小数据量场景)
修改子查询增加与外层的关联条件,确保每个外层行仅匹配对应分组的最大值:
Proc SQL; Create table XYZ.Tableau_Calcs AS SELECT t1.Value_Field ,t1.ID_Field ,(Select MAX(Value_Field) From XYX.Original_Calcs t2 where t2.ID_Field = t1.ID_Field and t2.Group = t1.Group) as SAS_Calc ,t1.Group ,t1.Date ,t1.Flag From XYX.Original_Calcs t1; Quit;
方案2:预聚合后左连接(更推荐,大数据量下性能远优于关联子查询)
先单独计算每个(ID_Field, Group)分组的最大值,再和原表关联,和Tableau FIXED逻辑完全一致:
Proc SQL; Create table XYZ.Tableau_Calcs AS SELECT t1.Value_Field ,t1.ID_Field ,t2.group_max as SAS_Calc ,t1.Group ,t1.Date ,t1.Flag From XYX.Original_Calcs t1 Left join ( select ID_Field, Group, MAX(Value_Field) as group_max from XYX.Original_Calcs group by ID_Field, Group ) t2 on t1.ID_Field = t2.ID_Field and t1.Group = t2.Group; Quit;
结果验证
按你提供的样例数据,上述代码返回结果完全匹配Tableau FIXED计算逻辑:
ID_Field=25193T4010且Group=H5的所有行SAS_Calc均为56ID_Field=25193T4010且Group=N9的所有行SAS_Calc均为38- 其余分组均返回对应分组内
Value_Field的最大值
内容的提问来源于stack exchange,提问作者D_man
相关产品推荐
相关产品推荐

