首页 >数据库 >mysql教程 >如何使用ROW_NUMBER()高效识别值发生变化的行?

如何使用ROW_NUMBER()高效识别值发生变化的行?

Patricia Arquette
Patricia Arquette原创
2025-01-02 14:25:43948浏览

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn