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
)
我有一个 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
)