Select 值变化

Select on value change

我有一个 table 在 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');

我想 select 所有 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' |
+----------+-----------------------+

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

这是一种孤岛问题。岛是具有相同 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.