You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:54:23