Heim > Datenbank > MySQL-Tutorial > Wie kann man Zeilen mit Wertänderungen mithilfe von ROW_NUMBER() effizient identifizieren?

Wie kann man Zeilen mit Wertänderungen mithilfe von ROW_NUMBER() effizient identifizieren?

Patricia Arquette
Freigeben: 2025-01-02 14:25:43
Original
960 Leute haben es durchsucht

How to Efficiently Identify Rows with Value Changes Using ROW_NUMBER()?

Auswählen von Zeilen mit Wertänderungen mithilfe von ROW_NUMBER

Im Kontext einer Tabelle, in der die Wertespalte einen sich über die Zeit ändernden Zustand widerspiegelt, wird die Auswahl der Momente, in denen sich dieser Wert änderte, können eine wertvolle analytische Aufgabe sein. In diesem Artikel wird eine Lösung vorgestellt, die die Funktion ROW_NUMBER verwendet, um solche Zeilen zu identifizieren. Dabei werden beide Szenarien berücksichtigt, in denen Werte steigen oder schwanken können.

Lösung für steigende Werte

Angenommene Werte können nur erhöhen, verwenden wir den folgenden Ansatz:

;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

Die Funktion ROW_NUMBER partitioniert die Tabelle nach dem Wert Spalte und weist Zeilen fortlaufende Nummern in der Reihenfolge ihrer Zeitwerte innerhalb jeder Partition zu. Indem wir Zeilen auswählen, in denen die ROW_NUMBER 1 ist, rufen wir das erste Vorkommen jedes einzelnen Werts ab, was eine Wertänderung bedeutet.

Lösung für schwankende Werte

Bei Werten schwanken kann, passen wir unseren Ansatz an, um dieser Komplexität gerecht zu 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;
Nach dem Login kopieren

In diesem Fall weisen wir ROW_NUMBERS zu zum gesamten Datensatz in chronologischer Reihenfolge. Anschließend führen wir einen LEFT OUTER JOIN der Tabelle mit sich selbst durch und gleichen Zeilen mit aufeinanderfolgenden ROW_NUMBERS und ungleichen Werten ab. Das Ergebnis stellt sicher, dass nur die Zeilen ausgewählt werden, die in der folgenden Zeile einen eindeutigen Wert haben.

Das obige ist der detaillierte Inhalt vonWie kann man Zeilen mit Wertänderungen mithilfe von ROW_NUMBER() effizient identifizieren?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

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