2017-07-05 3 views
0

Ich möchte eine Verlaufsdatei in SAS aktualisieren. Ich habe neue Beobachtungen, die sich mit bestehenden Datenzeilen überschneiden können.Ausgabe konditional von Merge

Was benötigt wird, ist eine Datei, die Zeilen von Dataset (new_data) haben würde, wo sie existieren und falls die Zeilen nicht existieren, dann von alten Satz (alte_Daten). Was ich herausgefunden habe, ist eine klobige Merge-Operation, die von der Reihenfolge der Datensätze abhängig ist. (== funktioniert nur, wenn new_data nach old_data ist.?)

data new_data; 
    input key value; 
datalines; 
    1 10 
    1 11 
    2 20 
    2 21 
    ; 
run; 

data old_data; 
    input key value; 
    datalines; 
    2 50 
    2 51 
    3 30 
    3 31 
    ; 
run; 

So würde Ich mag folgendes haben:

key value 
1 10 
1 11 
2 20 
2 21 
3 30 
3 31 

jedoch die folgende funktioniert nicht. Es produziert die Ausgabe darunter.

data updated_history; 
    merge New_data(in=a) old_data(in=b) ; 
    by key; 
    if a or (b and not a); 
run; 

.... 
2 50 
2 51 
... 

Aber aus irgendeinem Grund dies tut:

data updated_history; 
    merge old_data(in=b) New_data(in=a); 
    by key; 
    if a or (b and not a); 
run; 

Frage: Gibt es eine intelligente Art und Weise, von der Verwaltung Dataset die Werte von ausgewählten sind. Etwas wie: wenn ein dann value_from_dataset a;

+0

Beide Beispieleingabedateien enthalten mehrere Beobachtungen pro Schlüsselwert. In Ihrem einfachen Beispiel haben die gemeinsamen Schlüssel die gleiche Anzahl von Beobachtungen in jeder Datei. Aber wenn die Anzahl der Beobachtungen nicht übereinstimmt, dann werden Sie Schwierigkeiten haben, MERGE zu benutzen, um das zu tun, was Sie wollen. – Tom

Antwort

2

Die Reihenfolge, in der Sie die Datensätze in MERGE auflisten, ist die Reihenfolge, in der die Daten erfasst werden. Wenn also die Reihenfolge old, new lautet, werden Werte von old gelesen und Werte von new überschreiben die Werte von old. Aus diesem Grund funktioniert Ihre zweite Version und die erste nicht.

0

Da Sie mehrere Beobachtungen pro Schlüsselwert haben, möchten Sie MERGE wahrscheinlich NICHT verwenden, um diese Dateien zu kombinieren. Sie könnten dies mit SET tun, indem Sie die Daten zweimal mit zwei DOW-Schleifen lesen. In diesem Fall spielt die Reihenfolge des Datensatzes in der SET-Anweisung keine Rolle, da die Datensätze verschachtelt und nicht verbunden sind. Diese erste Schleife berechnet, welcher der beiden Eingabedatensätze irgendwelche Beobachtungen für diesen KEY-Wert aufweist.

data want ; 
    anyold=0; 
    anynew=0; 
    do until (last.key); 
    set old_data (in=inold) new_data(in=innew); 
    by key ; 
    if inold then anyold=1; 
    if innew then anynew=1; 
    end; 
    do until (last.key); 
    set old_data (in=inold) new_data(in=innew); 
    by key ; 
    if not (anyold and anynew and inold) then output; 
    end; 
    drop anyold anynew; 
run; 

Diese Art der Kombination ist wahrscheinlich einfacher mit SQL zu codieren.

proc sql ; 
    create table want as 
    select key,value from new_data 
    union 
    select key,value from old_data 
    where key in (select key from old_data except select key from new_data) 
    order by 1 
    ; 
quit;