首页 >数据库 >mysql教程 >SQL Server中如何高效检索列值发生变化的行?

SQL Server中如何高效检索列值发生变化的行?

Barbara Streisand
Barbara Streisand原创
2024-12-24 19:58:18516浏览

How to Efficiently Retrieve Rows Where a Column Value Changes in SQL Server?

检索具有不断变化的列值的行

问题:
您的任务是从基于特定列值的变化的表。在提供的示例数据中,“值”列经历了多次变化。您的目标是仅识别并选择该值已更改的行。

解决方案:

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

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