Heim >Datenbank >MySQL-Tutorial >Wie kann man Zeilen mit Wertänderungen mithilfe von ROW_NUMBER() effizient identifizieren?
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!