SQL selbst paarweise verbinden

8

Angenommen, ich habe eine Tabelle mit Einträgen wie

%Vor%

und für jede ID möchte ich diese Daten an sich selbst so verbinden, dass Beobachtungen mit nachfolgenden Departure Date und Arrival Date paarweise gruppiert werden - d. h. eine Abfahrt wird mit der vorherigen Ankunft für jede ID gepaart.

Im obigen Beispiel (wo die Beobachtungen der Einfachheit halber sortiert sind) wird die zweite Zeile an die 1., die 3. bis zur 2., die 5. bis 4. und die 6. bis 5. angehängt (also 4 Zeilen mit Feldern) %Code%).

Es kann potenziell mehr als drei Abfahrten für jede ID geben, daher ist ein allgemeiner Ansatz erforderlich. Bitte beachten Sie auch, dass es in den Daten Löcher geben kann, in denen ID Arrival Date Arrival City Departure Date Departure City Arrival Date2 Arrival City2 Departure Date2 Departure City2 und Arrival City nicht übereinstimmen - z. Das Departure City der 5. Zeile ist nicht das Arrival City der 6. Zeile, aber sie sollten trotzdem zusammengeführt werden. Ein wichtiges Ziel ist es, eine bessere Übersicht über die Anzahl der Löcher in den Daten zu erhalten.

    
user787267 15.01.2016, 16:45
quelle

6 Antworten

8

Eine Lösung besteht darin, einen CTE zu verwenden und zu berücksichtigen, dass der Unterschied zwischen zwei aufeinanderfolgenden Zeilen (durch den rowno gekennzeichnet) immer 1 ist (und auch die Daten berücksichtigen):

%Vor%

SQL Geige hier: SQLFiddle

    
Eduard Uta 18.01.2016 09:31
quelle
5

Versuchen Sie Folgendes:

%Vor%

Bearbeitet basierend auf Ihrem Kommentar zu:

  • finde den Datensatz mit dem frühesten Abfahrtsdatum nach dem vorherigen Datensatz Ankunftsdatum und
  • ignorieren Sie die Tatsache, dass der sechste Datensatz der Beispieldaten einen anderen Wert hat Abfahrtsstadt als die Ankunftsstadt des 5. Records.
scottyc 15.01.2016 19:44
quelle
4

Ich bin mir nicht sicher, nach welchem ​​Ergebnis Sie suchen sollten. Aber ich dachte mir, ich würde Ihnen eine Chance geben und sehen, ob Ihnen irgendetwas davon hilft.

%Vor%

Dies ist der Code zum Starten ..

%Vor%

führt zu:

%Vor%

Jeder Ort, an dem das Paar id = 0 ist ... Sie haben eine Lücke / baddata, aber Sie wollen es setzen ..

Sie könnten auch:

%Vor%

Dies wird die vorherige Abfahrt Stadt und Datum hinzufügen .. und Sie können tun, was Sie wollen mit den Nullen .. sie werden den ersten Flug bedeuten .. oder eine Lücke, wenn die nachfolgende Paar-ID = 0 ...

Die Auswahloptionen werden endlos .... Wenn null und lag (pairid) = 0, dann hast du die Zeile mit der Lücke. Wenn null und Paar id = id .. und lag (pairid) = id dann hast du Dein erster Flug ..

Ich meine, ich kann weitermachen ... und dir mehr Details geben, aber ich bin mir nicht sicher, ob du danach suchst .. Hoffe, es hat trotzdem geholfen ...

Viel Glück!

P.S Ich habe nicht gesehen, warum Sie den Tisch mit sich selbst verbinden mußten. Vielleicht habe ich den ganzen Punkt verpasst ... ich ... sorry, wenn das der Fall ist ...

    
Herman 18.01.2016 22:05
quelle
4

Es klingt für mich so, als wollten Sie die Ergebnisse drehen und die Ergebnisse in zusätzliche Spalten einfügen. Ich habe ROW_NUMBER () für die Bestellung verwendet. Ich verkettete die Spalten in einer Reihe vor dem Drehpunkt, schwenkte und verwendete dann eine Funktion, um die Verkettung umzukehren.

%Vor%

mit dieser SplitString-Funktion

%Vor%     
Bruce Dunwiddie 19.01.2016 18:53
quelle
3

Das sollte funktionieren:

%Vor%     
Giorgi Nakeuri 19.01.2016 18:09
quelle
3

versuche das,

%Vor%     
KumarHarsh 21.01.2016 03:48
quelle

Tags und Links