在proc sql中执行

时间:2017-11-26 14:39:06

标签: sas

如何在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;

1 个答案:

答案 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在非关键变量上发生碰撞时,您需要在输出中选择公共变量的合并为一个新的同名变量。