检索具有不断变化的列值的行
问题:
您的任务是从基于特定列值的变化的表。在提供的示例数据中,“值”列经历了多次变化。您的目标是仅识别并选择该值已更改的行。
解决方案:
使用 ROW_NUMBER 分区:
此技术利用 SQL Server 的 ROW_NUMBER 函数为不同“Value”内的行分配连续编号分区,按“时间”顺序排序。以下查询应用了这个概念:
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;
通过选择“rn”值为 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;
此查询使用一系列 JOIN 和过滤器来识别值更改,从而生成“Value”更改的时间列表。
以上是SQL Server中如何高效检索列值发生变化的行?的详细内容。更多信息请关注PHP中文网其他相关文章!