2017-05-09 27 views
1

對於我正在編寫的SAS程序,我需要將完全外部聯接4個不同的工作表完成等同於一個表。我最初只是想在PROC SQL這樣做,但很快就失控了,所以我決定在數據步驟中設置MERGE在一個PROC排序多個表排序

舉個例子:

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,儘管也許排序的工作方式不同。

+0

請記住,MERGE和FULL JOIN以不同方式處理多對多匹配。 – Tom

+0

'proc sql'可以一次加入多個表,不需要先排序,但可能效率不高。 – david25272

回答

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); 
+0

謝謝,我很欣賞這種迴應。我對我的問題沒有太大的希望,但是當我四處搜尋時,我實在找不到任何東西。儘管這對我的少量表格來說看起來有些過分,但循環PROC似乎是最好的解決方案。 – Etheur

+1

關於這個宏的好處是,它適用於1個表以及1000個表。編寫一次宏,將其包含在所有代碼中,並在需要時使用它代替PROC SORT。 – DomPazz

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; 
+0

有趣的是,雖然它看起來不像我的SAS版本(我在9.3上,'PROC DS2'出現在9.4中,我可以告訴)。很高興知道我的問題只能在更高級的版本中得到支持。 – Etheur