Lag () mit Bedingung in SQL Server

8

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?

    
user3292586 14.02.2014, 16:14
quelle

2 Antworten

7

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%
  • Der erste CTE namens "grouped" berechnet zwei 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.
  • Der zweite CTE mit dem Namen "order_in_group" bestimmt die Position der aktuellen Zeile innerhalb ihrer Insel oder Lücke. Bei einer Insel mit 3 Zeilen sind die Positionen 1 2 3 für die aufsteigende Reihenfolge und 3 2 1 für die absteigende Reihenfolge.
  • Schließlich wissen wir genug, um 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.

    
Andomar 14.02.2014 18:04
quelle
4

Ja, Sie können LEAD / LAG verwenden. Sie müssen nur vorberechnen wie weit Sie mit einer kleinen ROW_NUMBER () Magie springen können.

%Vor%     
Anon 14.02.2014 17:19
quelle

Tags und Links