Heim >Datenbank >MySQL-Tutorial >Wie kann ich in SQL effizient Zeilen identifizieren, in denen sich ein Spaltenwert ändert?

Wie kann ich in SQL effizient Zeilen identifizieren, in denen sich ein Spaltenwert ändert?

Linda Hamilton
Linda HamiltonOriginal
2024-12-25 02:56:101011Durchsuche

How Can I Efficiently Identify Rows Where a Column Value Changes in SQL?

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!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn