Heim >Datenbank >MySQL-Tutorial >Wie kann ich in SQL effizient Zeilen identifizieren, in denen sich ein Spaltenwert ändert?
Auswählen von Zeilen, in denen sich der Spaltenwert geändert hat: SQL-Techniken
Das Bestimmen der Fälle, in denen ein Spaltenwert einen Übergang durchläuft, ist in vielerlei Hinsicht ein kritischer Vorgang Datenanalyseszenarien. In diesem Artikel werden Techniken zur effizienten Identifizierung solcher Änderungen in einer Tabelle untersucht.
Problemstellung
Betrachten Sie die folgende Tabelle mit den Spalten „Wert“ und „Zeit“:
Value | Time | |
---|---|---|
0 | 15/06/2012 8:03:43 PM | |
1 | 15/06/2012 8:03:43 PM | * |
1 | 15/06/2012 8:03:48 PM | |
1 | 15/06/2012 8:03:53 PM | |
1 | 15/06/2012 8:03:58 PM | * |
2 | 15/06/2012 8:04:03 PM | * |
2 | 15/06/2012 8:04:08 PM | |
3 | 15/06/2012 8:04:13 PM | * |
3 | 15/06/2012 8:04:18 PM | |
3 | 15/06/2012 8:04:23 PM | |
2 | 15/06/2012 8:04:28 PM | * |
2 | 15/06/2012 8:04:33 PM |
Die Aufgabe besteht darin, die mit „*“ markierten Zeilen zu identifizieren, die Übergänge im „Wert“ anzeigen. Spalte.
Lösung
Verwenden von Fensterfunktionen (SQL Server 2012 und höher)
Mit in SQL Server eingeführten Fensterfunktionen 2012 kann dieser Vorgang effizient durchgeführt werden:
;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;
Diese Abfrage berechnet die Zeilennummer innerhalb jeder Partition von „Wert“ und wählt die erste Zeile (rn = 1) für jede Partition aus.
Verwenden von Tabellenverknüpfungen (SQL Server 2008 und früher)
Für Bei SQL Server-Versionen vor 2012 kann der folgende Ansatz verwendet werden:
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 führt a aus Self-Join in der Tabelle, Vergleich benachbarter Zeilen, um Wertänderungen zu identifizieren. Zum Speichern von Zwischenergebnissen ist eine separate Tabellenvariable erforderlich.
Hinweis: Fensterfunktionen bieten zwar eine bessere Leistung, sind jedoch möglicherweise nicht in allen Versionen von SQL Server verfügbar. Wählen Sie den Ansatz, der am besten zu Ihrer Version und Ihren Leistungsanforderungen passt.
Das obige ist der detaillierte Inhalt vonWie kann ich in SQL effizient Zeilen identifizieren, in denen sich ein Spaltenwert ändert?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!