2016-06-22 10 views
0

Ich habe die folgende Tabelle über Zwischenschritte einer Fahrten, die ich sammeln möchte, um eine Zeile pro Person und Tag zu erhalten. Die Zwischenschritte können beinhalten, dass der Passagier verschiedene Tore an einer Station verlässt und eingibt, die immer nacheinander folgen wird.SQL - Aggregieren von Zeilen von Daten

In der folgenden Tabelle wird der Passagier 1234 an der Station 5598 zur Zeit 1071 und dann an der Station 796 zur Zeit 1073 (die Zeiten sind mit Zahlenwerten codiert) verlassen. Sie verlassen dann an der Station 635 zur Zeit 1086, gefolgt von einer Eingabe an der Station 5148 zur Zeit 1088. Dieser spezielle Passagier hat zwei Zwischenbeine auf seiner Reise. Für Passagier 5678 haben sie nur ein Intermediat-Bein.

Die Tabelle ist wie folgt:

ID day station time type 
1234 133 5598  1071 exit 
1234 133 796  1073 entry 
1234 133 635  1086 exit 
1234 133 5148  1088 entry 
5678 133 8909  1305 exit 
5678 133 5158  1306 entry 

und ich möchte es so aussehen bekommen:

ID day stage1_exittime stage1_exitstation stage2_entrytime stage2_entrystation stage2_exittime stage2_exitstation stage3_entrytime stage3_entrystation 
1234 133 1071    5598     1073    796      1086    635     1088     5148 
5678 133 1305    8909     1306    5158     0     0     0     0 

ich FIRST_VALUE versucht haben, über und partitionieren durch, kann aber nicht bekommen es funktioniert. Der Schlüssel ist, dass ich sicherstellen muss, dass die Fahrten mit nur 1 Zwischenstrecke in Stufe 2_exit und Stufe 3 in der obigen Tabelle nicht belegt sind.

Es sollte beachtet werden, dass der Passagier auf seiner Fahrt bis zu 5 Zwischenbeine haben kann (nicht 3, wie das Beispiel zeigt).

+1

Was passiert, wenn eine Person an einem bestimmten Tag drei Zwischenbeine hat? Oder vier? Sind Sie sicher, dass es sicher ist, die Anzahl der Beine zu begrenzen, die Sie unterbringen können? –

+0

In der Theorie sollte es 3 Zwischenbeine sein, aber vielleicht sollte ich mehr Beine berücksichtigen (es sollte nur ein Maximum von 5 sein) – JassiL

Antwort

0

Dies sollte Ihnen helfen, Ihr Ergebnis zu erhalten.

Die Zeilennummer sortiert die Einträge und Exits und Sie müssen nur die richtige Zeilennummer nach Typ ermitteln, um die Reihenfolge zu bestimmen.

SELECT "ID", 
     "day", 
     MAX(CASE WHEN Rn = 1 AND "type" = 'exit' THEN "time" END) AS stage1_exittime, 
     MAX(CASE WHEN Rn = 1 AND "type" = 'exit' THEN "station" END) AS stage1_exitstation, 
     MAX(CASE WHEN Rn = 1 AND "type" = 'entry' THEN "time" END) AS stage2_entrytime, 
     MAX(CASE WHEN Rn = 1 AND "type" = 'entry' THEN "station" END) AS stage2_entrystation, 
     MAX(CASE WHEN Rn = 2 AND "type" = 'exit' THEN "time" END) AS stage2_exittime, 
     MAX(CASE WHEN Rn = 2 AND "type" = 'exit' THEN "station" END) AS stage2_exitstation, 
     MAX(CASE WHEN Rn = 2 AND "type" = 'entry' THEN "time" END) AS stage3_entrytime, 
     MAX(CASE WHEN Rn = 2 AND "type" = 'entry' THEN "station" END) AS stage3_entrystation 
FROM ( 
      SELECT "ID", 
        "station", 
        "time", 
        "type", 
        "day", 
        ROW_NUMBER() OVER (PARTITION BY "ID", "day", "type" ORDER BY "time") AS Rn 
      FROM myTable 
     ) mt 
GROUP BY "ID", 
     "day" 
+0

Schön! Es funktionierte! Vielen Dank für die schnelle Antwort – JassiL

Verwandte Themen