Alternativen zu SQL LEAD- und LAG-Funktionen in SQL Server 2008
In SQL Server 2008 sind LEAD- und LAG-Funktionen nicht verfügbar, was jedoch möglich ist stellen beim Vergleich von Werten zwischen aufeinanderfolgenden Zeilen eine Herausforderung dar. Dieser Leitfaden stellt alternative Ansätze vor, um eine ähnliche Funktionalität zu erreichen.
Problemstellung
Das Ziel besteht darin, Zeilen zu identifizieren, bei denen die aktuelle Zeile eine StatusId von 1 hat, und die nachfolgende Zeile hat eine StatusId von 6, wobei die Zeiten innerhalb derselben Minute liegen. In der bereitgestellten Tabelle möchten wir beispielsweise Zeilen-ID 6 abrufen, da Zeilen-ID 6 eine StatusId von 1 und Zeilen-ID 7 eine StatusId von 6 hat und ihre Zeiten im Wesentlichen gleich sind: 2014-02-19 06: 11.
Lösung 1: Self-Join
Ein Ansatz ist ein Self-Join:
select t.* from table t join table tnext on t.id = tnext.id - 1 and t.StatusId = 1 and tnext.StatusId = 6 and datediff(second, t.MinStartTime, tnext.MinStartTime) < 60;
Diese Abfrage gibt Zeilen zurück, bei denen die Id der aktuellen Zeile um eins kleiner ist als die Id der nächsten Zeile, die StatusId ist 1 für die aktuelle Zeile und 6 für die nächste Zeile , und der Zeitunterschied zwischen ihnen beträgt innerhalb von 60 Sekunden.
Lösung 2: Gleicher Kalender Minute
Wenn Sie benötigen, dass die Zeiten in derselben Kalenderminute liegen, können Sie die Abfrage wie folgt ändern:
select t.* from table t join table tnext on t.id = tnext.id - 1 and t.StatusId = 1 and tnext.StatusId = 6 and datediff(second, t.MinStartTime, tnext.MinStartTime) < 60 and datepart(minute, t.MinStartTime) = datepart(minute, tnext.MinStartTime);
Diese Abfrage prüft zusätzlich, ob die Minuten der beiden Zeilen sind gleich und stellen sicher, dass sie zur gleichen Kalenderminute gehören.
Das obige ist der detaillierte Inhalt vonWie repliziert man die SQL LEAD- und LAG-Funktionalität in SQL Server 2008?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!