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
Patricia ArquetteOriginal
2025-01-02 14:25:43959Durchsuche

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;

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;

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!

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