SAS中行对比删除重复值并保留指定字段数据的实现问题
SAS重复行处理解决方案
完整实现代码
/* 第一步:按分组规则排序,保证同组内空交易日期行排在前面 */ proc sort data=work.sample; by acct_num test_id final_amt final_amt_added tran_date; run; /* 第二步:处理重复行,提取额外金额字段 */ data work.want; set work.sample; by acct_num test_id final_amt final_amt_added; /* 保留变量跨行传递值 */ retain act_amt_extra .; /* 每个新匹配分组开始时重置额外金额为缺失 */ if first.final_amt_added then act_amt_extra = .; /* 遇到空交易日期的行,存下实际金额后删除该行 */ if missing(tran_date) then do; act_amt_extra = actual_amt; delete; end; /* 输出非空交易日期的行,自动携带同组的额外金额 */ run;
逻辑说明
- 排序阶段:按分组键
acct_num、test_id,以及金额匹配键final_amt、final_amt_added排序,追加tran_date排序是利用SAS缺失值小于非缺失值的特性,保证同匹配组内空交易日期的行排在非空行之前,方便后续取值 - 处理阶段:
- 用
by语句标识每个匹配分组的边界,first.变量可判断当前行是否为分组的第一行 retain语句声明的act_amt_extra变量会跨行保留值,不会在每次读取新行时被重置为缺失- 匹配到空交易日期的行时,仅保存该行的
actual_amt到act_amt_extra,不输出该行 - 非空交易日期的行直接输出,自动携带同组内空行提前存下的
actual_amt值,没有对应空行的分组该字段默认留空
- 用
内容的提问来源于stack exchange,提问作者Ezio_Auditore
相关产品推荐
相关产品推荐

