使用PROC SQL在SAS EG 5.1中需要FULL OUTER JOIN类型连接

时间:2018-02-23 15:27:35

标签: sql join sas

成功回答我的问题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。

1 个答案:

答案 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;