问题:
假设您有一个包含两列的表: Value 和时间。您想要标识“值”列发生更改的行。换句话说,您需要找到存储值发生变化的时刻,以星号行表示。
解决方案:
解决此问题的一种方法是利用窗口SQL 语句中的函数和行号:
引入行数字:
WITH x AS ( SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time) FROM dbo.table )
此步骤引入了一个名为 rn(行号)的新列,该列按时间升序为每个值分区中的每一行分配唯一的序列号。
识别更改:
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;
此查询在具有行号的表和其自身的移位版本 (y) 之间执行左外连接,以检查相邻行之间的 Value 列中的更改。 y.value 具有非 NULL 值的行表示更改。
以上是SQL 如何识别列值随时间的变化?的详细内容。更多信息请关注PHP中文网其他相关文章!