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

SAS中Proc SQL多匹配Full Join仅保留唯一匹配的实现方法

解决SAS Full Join多匹配仅保留唯一组的问题

当两个数据集在Pat和Date分组下存在多条记录时,full join会生成所有可能的组合(笛卡尔积),导致输出4行结果。要实现每组仅保留1:1的匹配对,核心是给每个分组内的记录添加唯一序号,再将序号作为额外的匹配条件。

方法一:PROC SQL子查询直接生成序号并关联

直接在子查询中用row_number()函数为每个Pat+Date分组内的记录编号,再基于编号做匹配:

proc sql;
    create table want as
    select a.*, b.*
    from (
        select *, row_number() over(partition by Pat, Date1 order by ID1) as seq
        from have1
    ) as a
    full join (
        select *, row_number() over(partition by Pat, Date2 order by ID2) as seq
        from have2
    ) as b
    on a.Pat = b.Pat
    and a.Date1 = b.Date2
    and a.seq = b.seq;
quit;

方法二:DATA步先添加序号再关联

先通过DATA步的by语句为每个分组生成序号,再执行关联:

/* 为高层表单添加组内序号 */
data have1_seq;
    set have1;
    by Pat Date1;
    if first.Date1 then seq = 0;
    seq + 1;
run;

/* 为详细表单添加组内序号 */
data have2_seq;
    set have2;
    by Pat Date2;
    if first.Date2 then seq = 0;
    seq + 1;
run;

/* 基于Pat、Date和序号执行Full Join */
proc sql;
    create table want as
    select *
    from have1_seq
    full join have2_seq
    on have1_seq.Pat = have2_seq.Pat
    and have1_seq.Date1 = have2_seq.Date2
    and have1_seq.seq = have2_seq.seq;
quit;

说明

两种方法都能生成仅包含2行的结果集,每个高层表单对应一个详细表单。如果两个分组内的记录数不一致(比如一个3条、一个2条),多出来的记录会保留缺失匹配项,符合Full Join的逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 13:09:58