问题描述
id -发生操作的地方的ID
t -行动时间
+----+----------+
| id | t |
+----+----------+
| 1 | 12:10:00 |
| 1 | 12:10:05 |
| 1 | 12:11:00 |
| 1 | 13:04:03 |
| 2 | 14:18:05 |
| 2 | 15:00:09 |
| 3 | 17:33:50 |
| 1 | 20:03:14 |
| 1 | 20:03:55 |
| 1 | 20:10:23 |
+----+----------+
目标是获得此输出
+----+----------+
| id | start |
+----+----------+
| 1 | 12:10:00 |
| 2 | 14:18:05 |
| 3 | 17:33:50 |
| 1 | 20:03:14 |
+----+----------+
开始-在id
具有排名,最小值等的脚本会按 id = 1
对行进行分组
我不知道如何解决此问题,也没有找到类似的帖子
这是sqlfiddle,带有脚本
预先感谢!
解决方法
这是一个典型的间隙和孤岛问题,您可以使用一些分析函数,例如ROW_NUMBER()
,LAG()
,LEAD()
等。大多数情况下,我们考虑通过操纵{{ 1}}选项,然后从另一个结果中减去一个结果,例如
PARTITION
,
解决此问题的最简单方法是使用lag()
:
select id,t as start
from (select t.*,lag(id) over (order by t) as prev_id
from t
) t
where prev_id is distinct from id;
基本上,您只需要id
更改时的值。
注意:我认为将其视为“典型”的“隔岛”问题是过大的选择,并且会使解决方案复杂化。
,这种类型的问题可以称为“缺岛问题”,可以通过行数和聚合的不同来解决。
select id,min(t),min(h)
from
(
select id,t,extract(hour from t) h,row_number() over (order by t) as seq1,row_number() over (partition by id order by t) as seq2
from records
) t
group by id,(seq1-seq2)
order by min(t);
参考:db<>fiddle