首页 > 数据库 > mysql教程 > SQL 如何识别列值随时间的变化?

SQL 如何识别列值随时间的变化?

Mary-Kate Olsen
发布: 2024-12-21 18:54:09
原创
816 人浏览过

How Can SQL Identify Changes in Column Values Over Time?

使用 SQL 识别列值的更改

问题:

假设您有一个包含两列的表: Value 和时间。您想要标识“值”列发生更改的行。换句话说,您需要找到存储值发生变化的时刻,以星号行表示。

解决方案:

解决此问题的一种方法是利用窗口SQL 语句中的函数和行号:

  1. 引入行数字:

    WITH x AS (
        SELECT value, time, rn = ROW_NUMBER() OVER (PARTITION BY Value ORDER BY Time)
        FROM dbo.table
    )
    登录后复制

    此步骤引入了一个名为 rn(行号)的新列,该列按时间升序为每个值分区中的每一行分配唯一的序列号。

  2. 识别更改:

    SELECT * FROM x WHERE rn = 1;
    登录后复制

    此查询过滤结果,仅包含 rn 等于 1 的行。这些是每个值分区中的第一行,表示值更改的开始。

向上和向下的额外考虑值:

如果值列既可以增加也可以减少,则需要更复杂的方法:

  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');
    登录后复制

    使用示例数据创建一个临时表来说明

  2. 引入行号(再次):

    WITH x AS (
        SELECT *, rn = ROW_NUMBER() OVER (ORDER BY time)
        FROM @x
    )
    登录后复制
  3. 识别值更改:

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

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板