SAS两表关联按分组匹配规则标记行分类(Rev/Good)
SAS交易记录匹配打标实现方案
核心逻辑
- 以Table1(TranType=P的交易表)为基准表,按
(ID, Prin, Int, Tot)作为匹配分组键 - 同分组内按记录出现顺序生成序号,用于区分首条/重复记录
- 与Table2(TranType=R的交易表)按匹配键左连接,判断是否存在交易日期晚于/等于P记录的对应R记录
- 按规则赋值Cat字段:同分组内第一条满足匹配要求的P记录赋值为
Rev,其余所有记录(含重复匹配记录、无匹配R的记录)统一赋值为Good
完整SAS代码
/* 步骤1:对Table1排序,按匹配键生成组内记录序号 */ proc sort data=Table1 out=table1_prep; by ID Prin Int Tot TranDt; run; data table1_prep; set table1_prep; by ID Prin Int Tot TranDt; /* 同匹配键+同交易日期的分组内,首条记录序号从1开始累加 */ if first.Tot then match_seq = 0; match_seq + 1; run; /* 步骤2:预处理Table2,仅保留R类记录的匹配字段和交易日期 */ data table2_prep; set Table2; where TranType = 'R'; rename TranDt = R_TranDt; keep ID Prin Int Tot R_TranDt; run; /* 步骤3:关联两表按规则打标,输出最终结果Table3 */ proc sql noprint; create table Table3 as select t1.ID, t1.Prin, t1.Int, t1.Tot, t1.TranType, t1.TranDt format=mmddyy10., case when min(t2.R_TranDt) >= t1.TranDt and t1.match_seq = 1 then 'Rev' else 'Good' end as Cat length=4 from table1_prep t1 left join table2_prep t2 on t1.ID = t2.ID and t1.Prin = t2.Prin and t1.Int = t2.Int and t1.Tot = t2.Tot group by t1.ID, t1.Prin, t1.Int, t1.Tot, t1.TranDt, t1.TranType, t1.match_seq order by t1.ID, t1.TranDt, t1.Prin; quit;
结果校验说明
运行代码后生成的Table3完全匹配需求样例:
- ID=101的两条同组P记录:匹配到日期符合要求的R记录,首条标
Rev,第二条标Good - ID=102、ID=104的P记录:无匹配R记录,统一标
Good - ID=103、ID=105的三条P记录(105含两个不同匹配键的分组):均匹配到符合日期要求的R记录,且为对应分组首条,全部标
Rev
内容的提问来源于stack exchange,提问作者Mary27
相关产品推荐
相关产品推荐

