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