成功回答我的问题SQL Cartesian type join
我需要在SAS中使用此方法来处理某些表。 SQL代码在这里,我在SQL Fiddle http://sqlfiddle.com/#!18/51b94/1
中尝试过SELECT coalesce(ae.subject, mh.subject) AS subject
,ae.aeterms
,mh.mhterms
FROM (
SELECT ae.*
,row_number() OVER (
PARTITION BY subject ORDER BY subject
) AS seqnum
FROM ae
) ae
FULL JOIN (
SELECT mh.*
,row_number() OVER (
PARTITION BY subject ORDER BY subject
) AS seqnum
FROM mh
) mh ON mh.subject = ae.subject
AND mh.seqnum = ae.seqnum
ORDER BY coalesce(ae.subject, mh.subject)
,ae.seqnum DESC;
但我知道row_number()over不可用是SAS。
答案 0 :(得分:1)
SQL旨在忽略行顺序,这就是他们必须添加您尝试使用的窗口函数的原因。
如果要为数据添加序列号,请使用数据步骤。
data ae_seq ;
set ae;
by subject ;
if first.subject then seqnum=0;
seqnum+1;
run;
data mh_seq ;
set mh;
by subject ;
if first.subject then seqnum=0;
seqnum+1;
run;
但它看起来你真的只是想强制SQL模仿数据步MERGE。当您在SAS中进行多对多合并时,它会将一个表中的第一行与另一个表中的第一行匹配,等等。当一个表贡献较少的行时,最后一行的值将转移到其余行上在那个小组。为了防止SAS继承较短数据集贡献的最后一行中的值,可以使用CALL MISSING()清除它们。
data want ;
merge ae mh ;
by subject ;
output ;
call missing(of _all_);
run;