2016-04-30 5 views
0

Ich bin auf der Suche nach einer Suche, die eine Art Hybrid zwischen einem Beitritt und Union ist. Ich habe eine große Anzahl von Datensätzen in meinem Hauptdatensatz, also suche ich etwas, das keine "Brute-Force" -Methode einer Viele-zu-Viele-Matrix wäre.SAS-Hash-Tabelle (rechts beitreten/Union)

Hier ist mein Hauptdatensatz, 'All' genannt, der bereits Preis für jedes der aufgeführten Produkte enthält.

product date  price 
apple 1/1/2011 1.05  
apple 1/3/2011 1.02 
apple 1/4/2011 1.07 

pepper 1/2/2011 0.73 
pepper 1/3/2011 0.75 
pepper 1/6/2011 0.79 

Mein anderer Daten-Datensatz (‚Preise‘ - hier nicht dargestellt, sondern enthalten die gleichen zwei Tasten, Produkt und Datum) gibt Preise für alle Produkte, auf jedem möglichen Zeitpunkt. Die Hash-Tabelle nachschauen ich im Wesentlichen jedes Datum in der ‚All‘ Tabelle nachschlagen erstellen möchten würde, und die Erzeugerpreise für ALLE Produkte für dieses Datum, was zu einer Tabelle wie folgt aus:

product date  price 
apple 1/1/2011 1.05  
pepper 1/1/2011 0.71 * 
apple 1/2/2011 1.04 * 
pepper 1/2/2011 0.73 
apple 1/3/2011 1.02 
pepper 1/3/2011 0.75 
apple 1/4/2011 1.07 
pepper 1/4/2011 0.76 * 
apple 1/6/2011 1.10 * 
pepper 1/6/2011 0.79 

Das heißt, solange ein Produkt eine Datums- und Preisangabe-Tabelle 'Alle' hat, sollten alle anderen Produkte diese ebenfalls aus der Nachschlagetabelle beziehen. Die Sternchen zeigen an, dass der Preis aus der Preistabelle nachgeschlagen wurde, und neue Zeilen mit Preisen für Produkte wurden im Wesentlichen in die neue Tabelle eingefügt.

Wenn die Hash-Tabelle keine gute Möglichkeit ist, lassen Sie mich alternative Methoden kennen.

+0

Ist Ihr gewünschter WANT-Datensatz nur eine Teilmenge des PREICES-Datensatzes? (Aufzeichnungen von PREISEN, wo DATUM eines der Daten in ALLEN ist?). Wie viele Datensätze in ALLEN und PREISEN? – Quentin

+0

Für die Zwecke dieses Beispiels, ja. In Wirklichkeit hat jeder tatsächlich Tausende von Transaktionen pro Schlüssel, während die Preise Produkt, Datum und Preis auflisten. Deshalb dachte ich, dass Hash hier solide sein würde. – AidKulesh

+0

Aber die Idee ist der Preis ist für alle Produkte jedes Datum erforderlich, solange mindestens ein Produkt für dieses Datum aufgeführt ist. – AidKulesh

Antwort

1

Nun, das ist alles andere als elegant, aber neugierig, wenn das folgende Ergebnis das gewünschte Ergebnis liefert? Da Sie mehrere Datensätze pro Schlüssel in ALL haben (was ich annehmen möchte, dass Sie pflegen), habe ich ALL im Grunde mit den Datensätzen in PREISEN vereinigt, die ein Datum in Alle haben, aber ich fügte ein Aus, um Datensätze auszuschließen, die bereits in ALL waren . Keine Ahnung, ob das Sinn macht oder was du willst. Bestimmt nicht als "elegant".

data all; 
    input product $7. date mmddyy10. price; 
    Y=1; 
    format date mmddyy10.; 
    cards; 
apple 01/01/2011 1.05 
apple 01/01/2011 1.05 
apple 01/03/2011 1.02 
pepper 01/02/2011 0.73 
pepper 01/03/2011 0.75 
pepper 01/06/2011 0.79 
; 
run; 
data prices; 
    input product $7. date mmddyy10. price; 
    format date mmddyy10.; 
    cards; 
apple 01/01/2011 1.05 
apple 01/02/2011 1.04 
apple 01/03/2011 1.02 
apple 01/04/2011 1.07 
apple 01/05/2011 1.01 
pepper 01/01/2011 0.70 
pepper 01/02/2011 0.73 
pepper 01/03/2011 0.75 
pepper 01/04/2011 0.76 
pepper 01/05/2011 0.77 
pepper 01/06/2011 0.79 
; 
run; 

proc sql; 
    create table want as 
    select * from all 
    union corr all 
    ((select product,date,price from 
     prices 
     where date IN (select distinct date from all) 
    ) 
    except corr 
    select product,date,price from all 
) 
    ; 
quit; 
+0

Danke, ich denke das ist ziemlich nett. Das einzige Ding ist ... das Dataset ALL hat ein Bündel mehr Felder, die ich nicht aufgelistet habe, keines von denen ich entfernt werden möchte. Ich kenne corr/all keywords nicht gut, aber es scheint, dass das corr Schlüsselwort hier angibt, nur die entsprechenden Spalten zwischen den 2 Tabellen zu überlagern. ALL hat ungefähr 30 Felder, PREISE hat nur 6 (von denen ich alle außer 3 entfernen kann). Wenn ich dies entweder mit oder ohne eine Kombination von corr/all ausführe, bekomme ich immer noch einen Fehler ... – AidKulesh

+0

- WARNUNG: Eine Tabelle wurde mit Null-Spalten erweitert, um die Operation EXCEPT set durchzuführen. FEHLER: Spalte 6 vom ersten Beitrag von EXCEPT ist nicht der gleiche Typ wie sein Gegenstück von der Sekunde. Fehler: Spalte 7 von dem ersten Beitrag von EXCEPT ist nicht derselbe Typ wie sein Gegenstück von der Sekunde. Ist das leicht korrigierbar? – AidKulesh

+0

Ich sollte hinzufügen, ich habe nichts dagegen, wenn die "eingefügten Zeilen" alle fast vollständig NULL sind, ist alles, was zählt, dass die Felder Produkt, Preis und Datum ausgefüllt sind. – AidKulesh