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
相关产品推荐
相关产品推荐

