Lag() mit Bedingung in sql server
ich habe eine Tabelle wie diese:
Number Price Type Date Time
------ ----- ---- ---------- ---------
23456 0,665 SV 2014/02/02 08:00:02
23457 1,3 EC 2014/02/02 07:50:45
23460 0,668 SV 2014/02/02 07:36:34
Für jede EG muss ich den vorherigen/nächsten SV-Preis. In diesem Fall wird die Abfrage einfach.
Select Lag(price, 1, price) over (order by date desc, time desc),
Lead(price, 1, price) over (order by date desc, time desc)
from ITEMS
Aber es gibt einige spezielle Fälle, wo zwei oder mehr Zeilen EG Typ:
Number Price Type Date Time
------ ----- ---- ---------- ---------
23456 0,665 SV 2014/02/02 08:00:02
23457 1,3 EC 2014/02/02 07:50:45
23658 2,4 EC 2014/02/02 07:50:45
23660 2,4 EC 2014/02/02 07:50:48
23465 0,668 SV 2014/02/02 07:36:34
kann ich Lead/Lag in diesen Fällen? Wenn nicht, habe ich eine Unterabfrage verwenden?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Deiner Frage (und Anon ' s ausgezeichnete Antwort) ist Teil die SQL-Inseln und Lücken. In dieser Antwort, werde ich versuchen zu untersuchen, die "row_number () - Magie" im detail.
Ich habe ein einfaches Beispiel, basierend auf Ereignissen in einem Ballspiel. Für jede Veranstaltung, die wir gerne drucken Sie die vorherigen und nächsten Quartal bei der damit verbundenen Nachricht:
Hier ist eine Abfrage zeigen Sie das "row_number () - Magie" - Ansatz:
row_number()
s. Die erste ist1 2 3
für jede Zeile in der Tabelle. Die zweiterow_number()
Orten pause Ansagen in einer Liste, und andere Ereignisse, die in einer zweiten Liste. Der Unterschied zwischen den beidenrn1 - rn2
, ist einzigartig für jeden Abschnitt des Spiels. Es ist hilfreich, um zu überprüfen, Unterschied in der Beispiel-Ausgabe: es ist in dergroup_nr
Spalte. Sie werden sehen, dass jeder Wert entspricht einem Abschnitt des Spiels.1 2 3
für die aufsteigende Reihenfolge und3 2 1
für die absteigender Reihenfolge.lag()
undlead()
wie weit Sie springen. Wir haben für die lagrank_asc
Zeilen zu finden, die Letzte Zeile des vorherigen Abschnitts. Zu finden ist die erste Zeile der nächsten Rubrik haben wir für Sie zu führenrank_desc
Zeilen.Hoffe, das hilft zur Klärung der "Magie" der Lücken und Inseln. Hier ist ein Beispiel auf SQL Fiddle.
Ja, Sie können LEAD/LAG. Sie brauchen nur, um vorauszuberechnen, wie weit Sie springen mit ein wenig ROW_NUMBER() Magie.
Hier ist noch ein weiterer Weg zu erreichen das gleiche Ergebnis, aber mit bedingten max/min-Funktionen das Fenster der über eine Ordinalzahl. Die Ordnungszahl kann eingestellt werden, basierend auf was auch immer Spalten den Zweck passt, aber in diesem Fall glaube ich, dass die OP will Sie
Date
undTime
.Beachten Sie, dass das Beispiel des OP wurde erweitert, um zu zeigen, dass eingestreute Sequenzen von
EC
yeild zu dem beabsichtigten Ergebnis führen. Die Mehrdeutigkeiten eingeführt, die durch die frühesten zwei aufeinanderfolgende Zeilen mit Typ -SV
wird in diesem Fall dazu führen, dass der maximale Wert abgeholt. Einrichten der Ordnungszahl enthalten diePrice
ist ein möglicher Weg, um dieses Verhalten zu ändern.Einer SQLFiddle können hier gefunden werden: http://sqlfiddle.com/#!18/85117/1