Zeilen mit sich entwickelnden Spaltenwerten abrufen
Problem:
Sie haben die Aufgabe, Zeilen aus a zu extrahieren Tabelle basierend auf Änderungen in einem bestimmten Spaltenwert. In den bereitgestellten Beispieldaten erfährt die Spalte „Wert“ mehrere Verschiebungen. Ihr Ziel besteht darin, nur die Zeilen zu identifizieren und auszuwählen, in denen sich dieser Wert geändert hat.
Lösung:
Verwenden der ROW_NUMBER-Partitionierung:
Diese Technik nutzt die Funktion ROW_NUMBER von SQL Server, um Zeilen innerhalb unterschiedlicher „Wert“-Partitionen sortiert fortlaufende Nummern zuzuweisen nach „Zeit“-Reihenfolge. Die folgende Abfrage wendet dieses Konzept an:
WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table ) SELECT * FROM x WHERE rn = 1;
Durch die Auswahl von Zeilen mit einem „rn“-Wert von 1 isolieren wir effektiv diejenigen, die das erste Vorkommen eines anderen „Werts“ in der Sequenz markieren.
Alternativer langsamerer Ansatz für dynamische Werte:
Wenn die Spalte „Wert“ beide aufsteigenden Werte zulässt und absteigender Änderungen bietet die folgende Abfrage eine langsamere, aber umfassendere Lösung:
DECLARE @x TABLE(value INT, [time] DATETIME) INSERT @x VALUES (0,'20120615 8:03:43 PM'),-- (1,'20120615 8:03:43 PM'),--* (1,'20120615 8:03:48 PM'),-- (1,'20120615 8:03:53 PM'),-- (1,'20120615 8:03:58 PM'),-- (2,'20120615 8:04:03 PM'),--* (2,'20120615 8:04:08 PM'),-- (3,'20120615 8:04:13 PM'),--* (3,'20120615 8:04:18 PM'),-- (3,'20120615 8:04:23 PM'),-- (2,'20120615 8:04:28 PM'),--* (2,'20120615 8:04:33 PM'); ;WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x ) SELECT x.value, x.[time] FROM x LEFT OUTER JOIN x AS y ON x.rn = y.rn + 1 AND x.value <> y.value WHERE y.value IS NOT NULL;
Diese Abfrage verwendet eine Reihe von JOINs und Filtern, um Wertänderungen zu identifizieren, was zu einer Liste der Zeiten führt, in denen sich „Wert“ geändert hat.
Das obige ist der detaillierte Inhalt vonWie kann ich Zeilen effizient abrufen, wenn sich ein Spaltenwert in SQL Server ändert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!