使用ROW_NUMBER 選擇值發生變化的行
在值列中反映隨時間變化的狀態的表上下文中,選擇當該值發生變化的時刻可能是一項有價值的分析任務。本文提出了一種使用 ROW_NUMBER 函數來識別此類行的解決方案,考慮了數值可能增加或波動的兩種情況。
增加值的解
假設值只能增加,我們採用以下方法:
;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;
ROW_NUMBER 函數對表進行分區值列,並依照每個分區中時間值的順序將連續的數字分配給行。透過選擇 ROW_NUMBER 為 1 的行,我們檢索每個不同值的第一次出現,這表示值的變化。
值波動的解決方案
當值可能會波動,我們調整我們的方法來解決這種複雜性:
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;
在這種情況下,我們按時間順序將ROW_NUMBERS 分配給整個資料集。然後,我們對錶與其本身執行 LEFT OUTER JOIN,以匹配具有連續 ROW_NUMBERS 和不相等值的行。結果可確保僅選擇下一行中具有不同值的那些行。
以上是如何使用ROW_NUMBER()高效識別值變化的行?的詳細內容。更多資訊請關注PHP中文網其他相關文章!