如何在proc sql中执行以下代码。 下面给出了两个proc语句和一个合并。
proc sort data=new out=new1 nodupkey;
by id;
where roll=100;
run;
proc sort data new2 out =new4 nodupkey
by id;
where roll=100;
run;
data score;
merge new4 (in=a) new1;
by id;
if a;
run;
答案 0 :(得分:0)
您显示的合并等同于SQL left-join。您需要“new2”中的所有行,并忽略“new”中没有公共ID的所有行。 id的唯一性(按预先排序)进一步支持左连接等价。
Proc SQL;
select new.*, new2.*
from new2
left join new on new.id = new2.id
where roll=100
order by id;
quit;
对于非典型数据的场景,其中有许多:合并中有许多ID,左连接不等效。
我确实遗漏了NODUPKEY的等价物。假定选项EQUALS有效,第一行组的选择将是等效的。未记录的MONOTONIC()函数可用于将默认行顺序应用于子查询,然后可以在具有表达式的分组中使用该子查询。
data LEFT;
input id x1 x2 x3;
datalines;
1 1 1 1
1 2 2 2
1 3 3 3
2 1 1 1
2 2 2 2
3 3 3 3
4 4 4 4
5 5 5 5
;
run;
data RIGHT;
input id y1 y2 y3 x1;
datalines;
1 1 1 1 11
2 1 1 1 22
3 1 2 3 4
3 2 3 4 5
3 3 4 5 6
4 1 1 1 44
6 6 6 6 6
;
run;
proc sql;
select
LEFT.id
, coalesce(RIGHT.x1,LEFT.x1) as x1
, LEFT.x2
, LEFT.x3
, RIGHT.y1
, RIGHT.y2
, RIGHT.y3
from
(
select * from (select monotonic() as _seq_, * from LEFT) group by id having _seq_ = min(_seq_)
)
as LEFT
left join
(
select * from (select monotonic() as _seq_, * from RIGHT) group by id having _seq_ = min(_seq_)
)
as RIGHT
on
LEFT.id = RIGHT.id
;
我觉得有必要重申SQL左连接并不总是相同的合并,并且SQL没有在DATA Step中隐含的公共变量'overlay'。当LEFT和RIGHT在非关键变量上发生碰撞时,您需要在输出中选择公共变量的合并为一个新的同名变量。