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