SAS如何筛选指定报告期全变量完全重复的COLLATERAL_ID及计数
问题说明
现有SAS数据集PRCR.TB_IFRS9_COLLATERAL,包含REPORTING_DATE、COLLATERAL_ID在内共13个变量,需求为筛选REPORTING_DATE = 31DEC2021的记录,提取全部13个变量取值完全一致的重复记录对应的COLLATERAL_ID及重复次数。
原有代码逻辑缺陷:group by子句仅指定了3个字段,未覆盖全部13个变量;未开启SQL严格聚合模式时,其余未分组字段会随机返回组内某条记录的取值,因此会出现分组后其他字段取值不一致的问题,无法满足全字段重复的判定要求。
最简实现方案
不需要手动枚举全部13个变量,借助SAS内置_all_关键字即可自动引用数据集所有变量作为分组依据,代码简洁且运行效率高,全版本SAS兼容的写法如下:
/* 第一步:筛选目标日期数据,排序阶段直接过滤无重复的单条记录 */ proc sort data=PRCR.TB_IFRS9_COLLATERAL(where=(REPORTING_DATE="31DEC2021"d)) out=temp_dup nouniquekey; by _all_; run; /* 第二步:按全变量分组计数,输出重复组的ID和重复次数 */ proc summary data=temp_dup nway; class _all_; output out=final_res(drop=_type_ _freq_ rename=(_count_=repeat_cnt) where=(repeat_cnt>1)); id COLLATERAL_ID; run;
- 最终输出数据集
final_res中,repeat_cnt为对应全变量重复组的重复次数,默认保留所有变量取值,可直接提取COLLATERAL_ID使用。 - 如果仅需要
COLLATERAL_ID和重复次数字段,可在第二步数据集选项中添加keep=COLLATERAL_ID repeat_cnt即可。 - 代码中
nouniquekey选项会在排序阶段直接剔除全变量组合仅出现1次的无重复记录,减少后续计算的数据量,大数据量场景下性能远高于手动枚举全字段的写法。
如果偏好SQL写法,且使用SAS 9.4M6及以上版本,也可以用更短的SQL代码实现:
proc sql; create table final_res as select COLLATERAL_ID, count(*) as repeat_cnt from PRCR.TB_IFRS9_COLLATERAL where REPORTING_DATE="31DEC2021"d group by _all_ having count(*) > 1; quit;
内容的提问来源于stack exchange,提问作者axel_p
相关产品推荐
相关产品推荐

