【问题标题】:Select on value change选择值变化
【发布时间】:2021-03-24 23:39:54
【问题描述】:

我在MySQL 数据库中有一个如下所示的表:

CREATE TABLE IF NOT EXISTS Example(Batch_Num int, Time DATETIME);
INSERT INTO Example 
VALUES
(1,'2020-12-04 05:06:12'), 
(1,'2020-12-04 05:06:13'), 
(1,'2020-12-04 05:06:14'), 
(2,'2020-12-04 05:06:20'), 
(2,'2020-12-04 05:07:12'), 
(2,'2020-12-04 05:07:20'), 
(1,'2020-12-04 05:07:25'), 
(1,'2020-12-04 05:07:35'), 
(3,'2020-12-04 05:07:35');

我想选择所有 Batch_Num 与之前的值不同的行,包括第一个:

+----------+-----------------------+
| BatchNum |      Change_Time      |
+----------+-----------------------+
|        1 | '2020-12-04 05:06:12' |
|        2 | '2020-12-04 05:06:20' |
|        1 | '2020-12-04 05:07:25' |
|        3 | '2020-12-04 05:07:35' |
+----------+-----------------------+

是否有一个关键字可以访问上一行以与当前行进行比较?或者其他方式来比较一行和之前的行?

【问题讨论】:

    标签: mysql sql datetime select gaps-and-islands


    【解决方案1】:

    这是一种孤岛问题。岛是具有相同batchnum 的相邻行,您需要每个岛的开始。

    这里,最简单的方法大概是lag()

    select *
    from (
        select e.*,
            lag(batchnum) over(order by time) lag_batchnum
        from example e
    ) e
    where not lag_batchnum <=> batchnum
    

    请注意,这需要 MySQL 8.0。在早期版本中,一种替代方法使用相关子查询:

    select e.*
    from example e
    where not batchnum <=> (
        select e1.batchnum
        from example e1
        where e1.time < e.time
        order by e1.time desc
        limit 1
    )
    

    这是一个demo on DB Fiddle

    【讨论】:

      猜你喜欢
      • 2014-05-06
      • 1970-01-01
      • 2020-01-11
      • 2018-03-01
      • 2021-05-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-25
      相关资源
      最近更新 更多