首頁 > 資料庫 > mysql教程 > 如何使用ROW_NUMBER()高效識別值變化的行?

如何使用ROW_NUMBER()高效識別值變化的行?

Patricia Arquette
發布: 2025-01-02 14:25:43
原創
943 人瀏覽過

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

使用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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板