Problem:
Angenommen, Sie haben eine Tabelle mit zwei Spalten: Wert und Zeit. Sie möchten Zeilen identifizieren, in denen sich die Spalte „Wert“ geändert hat. Mit anderen Worten, Sie müssen die Momente finden, in denen sich der gespeicherte Wert geändert hat, gekennzeichnet durch markierte Zeilen.
Lösung:
Ein Ansatz zur Lösung dieses Problems besteht in der Nutzung von Fenstern Funktionen und Zeilennummern innerhalb einer SQL-Anweisung:
Zeile einführen Zahlen:
WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table )
Dieser Schritt führt eine neue Spalte namens rn (Zeilennummer) ein, die jeder Zeile innerhalb jeder Wertpartition eine eindeutige Sequenznummer in aufsteigender Reihenfolge der Zeit zuweist.
Änderungen identifizieren:
SELECT * FROM x WHERE rn = 1;
Diese Abfrage filtert die Ergebnisse nach Schließen Sie nur Zeilen mit rn gleich 1 ein. Dies sind die ersten Zeilen in jeder Wertpartition, die den Beginn von Wertänderungen darstellen.
Zusätzliche Überlegungen zu steigenden und fallenden Werten:
Wenn die Spalte „Wert“ sowohl steigen als auch fallen kann, ist der Ansatz komplexer erforderlich:
Temporäre Tabelle erstellen:
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');
Erstellen Sie eine temporäre Tabelle mit den Beispieldaten, um den Prozess zu veranschaulichen.
Zeilennummern einführen (Noch einmal):
WITH x AS ( SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time) FROM @x )
Wertänderungen identifizieren:
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 führt einen linken äußeren Join zwischen den aus Tabelle mit den Zeilennummern und einer verschobenen Version von sich selbst (y), um nach Änderungen in der Spalte „Wert“ zwischen benachbarten Zeilen zu suchen. Zeilen mit Nicht-NULL-Werten für y.value stellen Änderungen dar.
Das obige ist der detaillierte Inhalt vonWie kann SQL Änderungen in Spaltenwerten im Laufe der Zeit identifizieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!