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

Wie kann ich Zeilen effizient abrufen, wenn sich ein Spaltenwert in SQL Server ändert?

Barbara Streisand
Freigeben: 2024-12-24 19:58:18
Original
509 Leute haben es durchsucht

How to Efficiently Retrieve Rows Where a Column Value Changes in SQL Server?

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;
Nach dem Login kopieren

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;
Nach dem Login kopieren

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!

Quelle:php.cn
Erklärung dieser Website
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
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage