在SAS中的多个表上左连接表

时间:2018-01-24 13:17:08

标签: join macros sas left-join

我有多个具有相同变量的相同格式的主表。我现在想要加入另一个变量,但由于我的计算机存储空间有限,我无法组合主表。有没有办法可以将变量连接到一个PROC SQL中的多个主表上?也许在宏的帮助下?

对于一个连接,LEFT JOIN代码看起来像这样,但我正在寻找一种替代方法,而不是复制和粘贴这5次:

PROC SQL;
CREATE TABLE New AS
    SELECT a.*, b.Value
        FROM Old a LEFT JOIN Additional b
            ON a.ID = b.ID;
QUIT;

2 个答案:

答案 0 :(得分:1)

您不能在一个create table语句中执行此操作,因为它一次只创建一个表。但你可以做一些事情,这取决于你的实际限制因素(你提到一些)。

如果你只是想避免写五次相同的代码,但是不关心它是如何执行的,那么只需在宏中编写代码,就像你引用一样。

%macro update_table(old=, new=);
PROC SQL;
CREATE TABLE &new. AS
    SELECT a.*, b.Value
        FROM &old. a LEFT JOIN Additional b
            ON a.ID = b.ID;
QUIT;
%mend update_table;
%update_table(old=old1, new=new1)
%update_table(old=old2, new=new2)
%update_table(old=old3, new=new3)

当然,如果五个表的名称都在某个模式中,您可以根据该模式进一步自动化,但是您没有提供足够的信息来解决这个问题。

另一方面,如果您需要在处理方面更有效地执行此操作而不是运行SQL查询五次,则可以通过多种方式完成此操作,具体取决于您的附加细节表和您的具体限制。在我看来,你在这里有一个很好的用例进行格式查找,例如;例如,见Jenine Eason's paper, Proc Format, a Speedy Alternative to Sort/Merge。如果你只是在合并ID,这很容易。

data for_format;
  set additional;
  start = ID;
  label = value;
  fmtname='AdditionalF'; *or '$AdditionalF' if ID is character-valued;
  output;
  if _n_=1 then do;  *creating an "other" option so it returns missing if not found;
    hlo='o';
    label = ' ';
    output;
  end;
run;

然后您只需要五个数据步骤并添加PUT语句,或者您甚至可以使用该格式格式化ID变量,并且每当您拥有该值时做了大多数PROC(如果这类似于数据中你并不真正需要的分类器)。

答案 1 :(得分:1)

您可以使用哈希表一次性通过数据步骤中的数据来查找值。

data new1 new2 new3;
set old1(in=a) old2(in=b) old3(in=c);
format value best.;
if _n_=1 then do;
    %create_hash(lk,id,value,"Additional");
end;
value = .;
rc = lk.find();

drop rc;

if a then
    output new1;
else if b then 
    output new2;
else if c then
    output new3;
run;

%create_hash()宏可用here

您也可以使用具有相同数据步骤语法的Joe格式。