从重复的组开始一个时间段

问题描述

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

line

,

解决此问题的最简单方法是使用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

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...