2016-04-28 8 views
2

ich eine Tabelle A, dieJOIN mehrere Zeilen auf mehrere Spalten in einreihige Netezza/Postgres

Date   Name  Value 
---------------------------- 
2015-01-01 A   12 
2015-01-01 B   13 
2015-01-01 C   10 
2015-01-01 D   9 
2015-01-01 E   15 
2015-01-01 F   11 
2015-01-02 A   1 
2015-01-02 B   2 
2015-01-02 C   3 
2015-01-02 D   4 
2015-01-02 E   5 
2015-01-02 F   6 
2015-01-03 A   7 
2015-01-03 B   8 
2015-01-03 C   9 
2015-01-03 D   10 
2015-01-03 E   15 
2015-01-03 F   16 
.... 

sieht wie folgt aus, die für jeden Tag einen Wert für jeden Namen enthält. Ich brauche eine zweite Tabelle, die wie folgt

Date   Name ValueDate ValueDate+1  ValueDate+2 
-------------------------------------------------------------- 
2015-01-01 A   12   1    7 
2015-01-01 B   13   2    8 
2015-01-01 C   10   3    9 
2015-01-01 D   9   4    10 
2015-01-01 E   15   5    15 
2015-01-01 F   11   6    16 
2015-01-02 A   1   7    ... 
2015-01-02 B   2   8    ... 
2015-01-02 C   3   9    ... 
2015-01-02 D   4   10    ... 
2015-01-02 E   5   15    ... 
2015-01-02 F   6   16    ... 

I, die die Daten korrekt

Date   Name ValueDate  ValueDate+1  ValueDate+2 
---------------------------------------------------------------- 
2015-01-01 A   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 B   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 C   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 D   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 E   2015-01-01 2015-01-02  2015-01-03 
2015-01-01 F   2015-01-01 2015-01-02  2015-01-03 
... 

dann Meine Idee eingegeben hat alles versucht, die Schaffung eines Zwischentisch sieht war eine Art von JOIN auf dem Tisch verwenden, um eine zu Karte, die die geentsprochenen Werte zu den Terminen und verwenden s.th wie

CASE WHEN Date = ValueDate THEN Value ELSE NULL END AS ValueDate+1 

ich, um herauszufinden, habe Schwierigkeiten, wie dies in SQL getan werden kann. Ich brauche im Grunde alle Werte über ein Fenster für eine erste Datumssequenz. Um einen Hintergrund zu geben, möchte ich für ein regelmäßiges Zeitintervall sehen, wie sich der Wert in den folgenden x Tagen verhält. Die Datentypen sind Datum für alle Datumsspalten, Varchar für den Namen und Zahlen für die Werte. Das ValueDate + 1 und +2 bedeutet +1/2 Tage. Es kann auch nicht ausgeschlossen werden, dass die Anzahl der Namen im Zeitverlauf konstant bleibt.

dank

+0

Für mich sind das zwei linke Joins und ein Pivot.Wenn Ihre [netezza-Version] (http://www-01.ibm.com/support/docview.wss?uid=swg21669899) "pivoting" unterstützt, müssen Sie möglicherweise dynamic sql verwenden, um die Datumsnamen als zu generieren eine Spaltenüberschrift, insbesondere wenn die Anzahl der Spalten variabel ist. – xQbert

Antwort

0

fand ich einen Weg, um die gewünschten Ergebnisse zu bekommen, indem ein row_number Schreiben() Unterauswahlgrenze auf die gewünschte Fenstergröße. Welche gibt jeden Eintrag pro Tag s.th wie diese

Date   Name  Value Row_Num 
--------------------------------------- 
2015-01-01 A   12  0 
2015-01-01 A   12  1 
2015-01-01 A   12  2 
2015-01-01 A   12  3 

Im nächsten Schritt ein

(Date + Row_Num*INTERVAL'1 DAY')::DATE 

die dann auf der ersten Tabelle verbunden werden kann, verwenden kann und geschwenkt. Dies ermöglicht eine beliebige Kombination von Namen pro Datum.

1

Sie wollen einfach nur lead():

select a.*, 
     lead(value) over (partition by name order by date) as value_1, 
     lead(value, 2) over (partition by name order by date) as value_2 
from a; 
+0

Danke für die Antwort, leider funktioniert das nicht, wenn der Name pro Datum im Laufe der Zeit zählt, was ich nicht ausschließen kann – ThatQuantDude

+0

@ Markus.london. . . Ich verstehe deinen Kommentar nicht. Dies sollte den Wert aus der "nächsten" Zeile der Tabelle für jeden Namen holen, wobei "nächstes" das nächste in der Reihenfolge nach Datum ist. Das scheint das zu sein, wonach Sie fragen. –

+0

Ich habe Fälle, in denen beispielsweise Name A für einige Tage fehlt, würde das auch funktionieren? – ThatQuantDude

0

Ich bin unklar über Ihre Problemstellung -

Zuerst Sie nicht sagen, ob die "Date" in den Daten ist ein Datumstyp oder nur eine Zeichenfolge, die wie ein Datum aussieht.

Ist "Wert" der Primärschlüssel für jede Datenzeile? Oder ist es ein tatsächlicher Wert, der bei der Berechnung von "ValueDate + 1" verwendet wird? Wenn das so ist, wie?

Ist "ValueDate" einfach der Wert von "Date" und "ValueDate + 1" der Tag nach dem "Date"? Oder ist es der Monat danach?

Soll ValueDate der Wert der Tage "Datum" plus "Wert" sein?

Können Sie das Problem neu formulieren und Typen Ihrer Daten einschließen?

Können Sie das Problem mit Gleichungen oder Formeln zusammen mit der Art der Ausgabewerte angeben, die Sie anzeigen müssen?

Wenn Sie können, kann ich Ihnen zeigen, wie man es in SQL formatiert.

- Ada

+0

Ich habe die Datentypen hinzugefügt, das ValueDate + 1 ist einfach der Wert bei Datum + 1 Tag. Es gibt keine Formeln, bei denen es darum geht, die vorhandenen Werte so umzuordnen, dass Sie sehen können, wie sich jeder 'Name' in den nächsten Tagen ändert. Die Werte stammen alle aus Tabelle a – ThatQuantDude