2017-05-09 5 views
1

Für ein SAS-Programm, das ich schreibe, muss ich das Äquivalent voll äußerer verbinden 4 verschiedene Arbeitstabellen in einer einzigen Tabelle. Ich wollte es zunächst in einem PROC SQL tun, aber das wurde schnell außer Kontrolle geraten, also entschied ich mich stattdessen, es mit einem MERGE in einem Datenschritt einzurichten.Sortierung mehrerer Tabellen in einem PROC SORT

Als Beispiel:

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; 

Es scheint Art umständlich jede Tabelle einzeln durch exakt den gleichen Feldsatz sortieren zu müssen. Ich habe eine Makrovariable eingerichtet, die der Liste der Spaltennamen entspricht, aber ich muss immer noch eine Zeile für jede Tabelle haben.

Gibt es eine Möglichkeit, etwas zu schreiben, um eine auf mehreren Tabellen gleichzeitig auszuführen, wenn sie alle die gleichen Spalten haben? Von dem, was ich weiß von SAS, würde ich erwarten, dass dies so etwas wie arbeiten:

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

Oder auch so etwas, wenn die Tabellen wie in diesem Beispiel Gemusterten:

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

Aber ich habe nicht in der Lage, entweder zur Arbeit zu kommen. Zugegebenermaßen habe ich nicht versucht, es über ein Array einzurichten, sondern vor allem, weil das für eine so kurze Liste von Tabellen wie Overkill erscheint (und eine längere Liste von Tabellen würde wahrscheinlich eine andere Zusammenführungslösung insgesamt rechtfertigen).

Gemessen an der Antwort here, bin ich nicht optimistisch, PROCs für mehrere Tabellen gleichzeitig auszuführen, obwohl die Sortierung möglicherweise anders funktioniert.

+0

Denken Sie daran, dass MERGE und FULL JOIN viele bis viele Übereinstimmungen unterschiedlich behandeln. – Tom

+0

'proc sql' kann mehrere Tabellen gleichzeitig verbinden, ohne zuerst zu sortieren, aber es ist möglicherweise nicht sehr effizient. – david25272

Antwort

3

Nein, es ist nicht möglich, 1 PROC SORT zu haben und mehrere Tabellen sortieren zu lassen. Sie können ein Makro erstellen, um den umständlichen Code für Sie zu schreiben. Wie dies

%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; 

Dann

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

Danke, ich schätze die Antwort. Ich hatte nicht viel Hoffnung auf ein "Ja" zu meiner Frage, aber ich konnte wirklich nichts auf die eine oder andere Weise finden, als ich mich umschaute. Obwohl dies für meine kleine Anzahl von Tabellen wie ein Overkill erscheint, scheint die PROC-Schleife die beste Lösung zu sein. – Etheur

+1

Das gute an diesem Makro ist, dass es sowohl für 1 Tabelle als auch für 1000 Tabellen funktioniert. Schreiben Sie das Makro einmal, fügen Sie es in Ihren gesamten Code ein und verwenden Sie es anstelle von PROC SORT, wenn Sie es benötigen. – DomPazz

1

Es ist eine zweite Antwort wert. Wenn Sie eine aktuelle Version von SAS haben, können Sie PROC DS2 für die Zusammenführung verwenden. DS2 erfordert nicht, dass Sie die Tabellen vorsortiert haben. Siehe das folgende Beispiel:

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

Interessant, obwohl es nicht wie meine Version von SAS aussieht (ich bin auf 9.3, und "PROC DS2" erscheint in 9.4 von dem, was ich sagen kann). Gut zu wissen, dass meine Frage nur in fortgeschritteneren Versionen abgesetzt werden kann. – Etheur

Verwandte Themen