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

SAS不等行数据列合并:生成含Discount列的Data3表求助

实现代码方案

方法一:PROC SQL 分组拼接+左连接

逻辑直观,适合快速实现需求:

/* 第一步:从Data2筛选Source=Discount的数据,按policy和Risk分组拼接Item1 */
proc sql noprint;
    create table discount_temp as
    select policy, Risk, catx('*', Item1) as Discount
    from Data2
    where Source = 'Discount'
    group by policy, Risk;

/* 第二步:将拼接结果与Data1左连接,生成包含Discount列的Data3 */
    create table Data3 as
    select a.*, b.Discount
    from Data1 as a
    left join discount_temp as b
    on a.policy = b.policy and a.Risk = b.Risk;
quit;

代码说明

  • catx('*', Item1):自动忽略缺失值,用*拼接同组内所有Item1值
  • LEFT JOIN:保证Data1的所有行都保留,未匹配到Discount的行,Discount列显示为缺失
  • discount_temp为临时中间表,存储分组拼接后的结果,避免重复计算

方法二:DATA步哈希表匹配(适合大数据量场景)

数据集较大时,哈希表匹配效率更高,先预处理Data2再匹配:

/* 预处理Data2:筛选Discount数据并按分组字段排序 */
proc sort data=Data2(where=(Source='Discount')) out=Data2_discount;
    by policy Risk;
run;

/* 按policy+Risk分组拼接Item1 */
data discount_hash;
    length Discount $200; /* 根据Item1实际长度调整字符变量长度 */
    retain Discount;
    set Data2_discount;
    by policy Risk;

    if first.Risk then Discount = Item1;
    else Discount = catx('*', Discount, Item1);

    if last.Risk then output;
run;

/* 用哈希表匹配Data1,生成Data3 */
data Data3;
    set Data1;
    if _n_ = 1 then do;
        declare hash h(dataset:'discount_hash');
        h.defineKey('policy', 'Risk');
        h.defineData('Discount');
        h.defineDone();
        call missing(Discount);
    end;

    rc = h.find();
    drop rc;
run;

代码说明

  1. 先筛选并排序Data2中符合条件的数据,确保同组的policy+Risk连续
  2. 用RETAIN和BY组逻辑完成拼接,仅保留每个policy+Risk的最终拼接结果
  3. 哈希表加载预处理后的结果,遍历Data1每一行完成匹配,未匹配到的行Discount列保持缺失

注意事项

  • 若Item1为数值型,需先转为字符型再拼接,例如用put(Item1, best.)替换代码中的Item1
  • 需根据实际拼接后内容的长度,调整length Discount $200中的数值,避免内容截断

内容的提问来源于stack exchange,提问作者Sheri

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:55:20