在一个PROC SORT中对多个表进行排序

时间:2017-05-09 22:20:11

标签: sas

对于我正在编写的SAS程序,我需要完全相同的将4个不同的工作表连接到一个表中。我最初只是在PROC SQL中执行此操作,但很快就失控了,所以我决定在数据步骤中使用MERGE进行设置。

举个例子:

proc sort data = TABLE_1; by COL1 COL2 COL3;
proc sort data = TABLE_2; by COL1 COL2 COL3;
proc sort data = TABLE_3; by COL1 COL2 COL3;
proc sort data = TABLE_4; by COL1 COL2 COL3;

data NEW_TABLE;
    merge TABLE_1 TABLE_2 TABLE_3 TABLE_4;
    by COL1 COL2 COL3;

需要使用相同的字段集对每个表进行单独排序似乎很麻烦。我已经设置了一个宏变量来等同于列名列表,但是我仍然需要为每个表创建一行。

如果它们都有相同的列,有没有办法在多个表上同时写一些内容来执行PROC SORT?根据我对SAS的了解,我希望这样的事情可以发挥作用:

proc sort data = (TABLE_1 TABLE_2 TABLE_3 TABLE_4); by COL1 COL2 COL3;

或者甚至是这样的事情,如果这些表的编号如下例所示:

proc sort data = (TABLE_1-TABLE_4); by COL1 COL2 COL3;

但是我还没能上班。不可否认,我还没有尝试通过数组进行设置,但主要是因为对于如此短的表列表而言似乎有点过分(而较长的表列表可能会完全保证不同的合并解决方案)。

从响应here来看,我对一次在多个表上执行PROC并不乐观,尽管可能排序的工作方式不同。

2 个答案:

答案 0 :(得分:3)

不,不可能拥有1 PROC SORT并让它对多个表进行排序。您可以创建一个宏来为您编写繁琐的代码。喜欢这个

%macro sortem(tables,byvar);
%local i n table;
%let n=%sysfunc(countw(&tables));
%do i=1 %to &n;
   %let table=%scan(&tables,&i);
   proc sort data=&table;
   by &byvar;
   run;
%end;
%mend;

然后致电

%sortem(table_1 table_2 table_3 table_4, COL1 COL2 COL3);

答案 1 :(得分:1)

值得第二个答案。如果您有最新版本的SAS,则可以使用PROC DS2进行合并。 DS2不要求您对表进行预先排序。请参阅以下示例:

data table1;
do x=1 to 100;
    a = rannor(1);
    output;
end;
run;

data table2; /*Reverse order*/
do x=100 to 1 by -1;
    b = rannor(2);
    output;
end;
run;

data table3;
do x=1 to 100;
    c = rannor(3);
    output;
end;
run;

proc sort data=table3; /*Make Table3 out of order*/
by c;
run;

proc ds2 ;
data work.comb /overwrite=yes;
  method run();
    merge table1 table2 table3;
    by x;
  end;
enddata;
run;
quit;