SAS全连接结果异常:id1字段值全部为1的解决方法
解决SAS数据集行对齐合并的问题
问题原因
你使用proc sql的full join时,因为两个数据集的acct和date完全相同,会触发笛卡尔积匹配——table1的每一行都会和table2的所有行进行关联,最终生成3×4=12行数据,这显然不是你需要的行对齐合并效果,你看到的id1全为1大概率是数据显示不全或筛选后的结果。
解决方案
方法一:用Data Step的Merge语句(推荐)
这是最贴合你需求的方式,SAS的merge在按by变量分组后,会在同一分组内按行顺序匹配两个数据集的记录,自动给缺失的行补全缺失值:
data new; merge table1 table2; by acct date; run;
执行后会直接得到你期望的输出:前3行对应两个数据集的前3行记录,第4行因table1无对应行,id1自动填充为缺失值,id2取table2的第4行值。
方法二:添加行号后用Proc SQL连接
如果必须使用Proc SQL,可以先给两个数据集添加分组内的行号,再按行号+连接键做全连接:
/* 为table1添加分组内的行号 */ data table1_with_row; set table1; by acct date; if first.date then row_num = 0; row_num + 1; run; /* 为table2添加分组内的行号 */ data table2_with_row; set table2; by acct date; if first.date then row_num = 0; row_num + 1; run; /* 按行号+连接键全连接,确保行对齐 */ proc sql; create table new as select coalesce(a.acct, b.acct) as acct, coalesce(a.date, b.date) as date, coalesce(a.Name, b.Name) as Name, a.id1, b.id2 from table1_with_row a full join table2_with_row b on a.acct = b.acct and a.date = b.date and a.row_num = b.row_num; quit;
coalesce函数用于提取非缺失的键值和Name字段,保证这些字段不会出现缺失,最终实现行对齐的合并效果。
内容的提问来源于stack exchange,提问作者ankita sharma
相关产品推荐
相关产品推荐

