Ich habe eine Tabelle wie folgt:
%Vor%Für jede EC benötige ich den vorherigen / nächsten SV-Preis. In diesem Fall ist die Abfrage einfach.
%Vor%Es gibt jedoch einige spezielle Fälle, in denen zwei oder mehr Zeilen vom Typ EC sind:
%Vor%kann ich in diesen Fällen Lead / Lag verwenden? Wenn nicht, musste ich eine Unterabfrage verwenden?
Ihre Frage (und Anons exzellente Antwort) ist Teil von SQL von Inseln und Lücken . In dieser Antwort werde ich versuchen, die "row_number () Magie" im Detail zu untersuchen.
Ich habe ein einfaches Beispiel basierend auf Ereignissen in einem Ballspiel gemacht. Für jede Veranstaltung möchten wir die vorherige und nächste Quartalsmeldung ausdrucken:
%Vor%Hier ist eine Abfrage, die den Ansatz "row_number () magic" zeigt:
%Vor%row_number()
s. Der erste ist 1 2 3
für jede Zeile in der Tabelle. Die zweite row_number()
platziert Ankündigungen in einer Liste und andere Ereignisse in einer zweiten Liste. Der Unterschied zwischen den beiden, rn1 - rn2
, ist für jeden Abschnitt des Spiels einzigartig. Es ist hilfreich, den Unterschied in der Beispielausgabe zu überprüfen: Er befindet sich in der Spalte group_nr
. Du wirst sehen, dass jeder Wert einem Abschnitt des Spiels entspricht. 1 2 3
für die aufsteigende Reihenfolge und 3 2 1
für die absteigende Reihenfolge. lag()
und lead()
zu sagen, wie weit man springen soll. Wir müssen rank_asc
Zeilen nacheilen, um die letzte Zeile des vorherigen Abschnitts zu finden. Um die erste Zeile des nächsten Abschnitts zu finden, müssen wir rank_desc
rows führen. Ich hoffe, dies hilft, die "Magie" von Lücken und Inseln zu klären. Hier ist ein Arbeitsbeispiel in SQL Fiddle.
Tags und Links sql-server lag lead