sql - 从重复组中获取时间段的开始

标签 sql postgresql window-functions gaps-and-islands

id - 操作发生地点的 ID
t - Action 时间

+----+----------+
| 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()等等。大多数情况下,我们考虑通过操作PARTITION来两次应用分析函数。选项,并将一个结果从另一个结果中减去,例如

SELECT DISTINCT tt.ID, FIRST_VALUE(t) OVER W AS start
  FROM (SELECT t.*,
               ROW_NUMBER() OVER(ORDER BY t) 
             - ROW_NUMBER() OVER(PARTITION BY ID ORDER BY t) AS rn        
          FROM (SELECT ID, t FROM records) t) tt WINDOW W AS
          (PARTITION BY rn ORDER BY t ROWS 
             BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
 ORDER BY start;

 +----+----------+
 | id |  start   |
 +----+----------+
 |  1 | 12:10:00 |
 |  2 | 14:18:05 |
 |  3 | 17:33:50 |
 |  1 | 20:03:14 |
 +----+----------+

Demo

关于sql - 从重复组中获取时间段的开始,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63654821/

相关文章:

从一个数据库到另一个数据库的sqlite数据

mysql - 通过比较两个表更新sql中的查询

javascript - 从 postgres 数据库中获取 Node js 中的多个 Refcursor(使用 pg-promise)

sql - 计算列组合的出现次数

PostgreSQL - 使用窗口函数时如何知道我在哪个分区?

mysql - 更改列类型并为此类型设置适当格式的值

php - MySQL 'bind_param' 语句似乎不起作用 - 使用 Cake 定制

php - 关于序列的 postgresql nextval 问题

sql - 从不完整的数据返回结果?

mysql - 如何在 MySql 中对分区进行排名