【发布时间】:2021-05-05 05:56:41
【问题描述】:
我在 SQL Server 中有这样的表:
id start_time end_time
1 10:00:00 10:34:00
2 10:38:00 10:52:00
3 10:53:00 11:23:00
4 11:24:00 11:56:00
5 14:20:00 14:40:00
6 14:41:00 14:59:00
7 15:30:00 15:40:00
我想要的是一个根据两个连续记录之间的时间差输出合并记录的查询(行 n 的 end_time 和行 n+1 的 start_time ) .时间差小于2分钟的记录合并为一个时间条目,并保留第一条记录的ID。如果多个连续记录的时间差小于 2 分钟,这也应该合并两个以上的记录。
这将是预期的输出:
id start_time end_time
1 10:00:00 10:34:00
2 10:38:00 11:56:00
5 14:20:00 14:59:00
7 15:30:00 15:40:00
提前感谢有关如何构建查询的任何提示。
编辑: 我从以下代码开始计算lead_time和时间差,但不知道如何分组和合并。
WITH rows AS
(
SELECT *, ROW_NUMBER() OVER (ORDER BY Id) AS rn
FROM #temp
)
SELECT mc.id, mc.start_time, mc.end_time, mp.start_time lead_time, DATEDIFF(MINUTE, mc.[end_time], mp.[start_time]) as DiffToNewSession
FROM rows mc
LEFT JOIN rows mp
ON mc.rn = mp.rn - 1
【问题讨论】:
-
你可以看看this answer。它使用
Group by,它可以工作。 -
根据问题指南,请展示您的尝试并告诉我们您发现了什么(在本网站或其他地方)以及为什么它不能满足您的需求。
-
基于两个连续记录之间的时间差 - 你错过了时间差的定义,因为有两个时间列。
-
@astentx,OP表示一行的“end_time”和下一行的“start_time”之间的差异......这就是他如何获得ID = 2,start_time的行= 10:30, end_time = 11:56 .... ID 为 3 的行在 ID 为 2 的行结束后 1 分钟开始,第 4 行在第 3 行结束后 1 分钟开始,但第 5 行在第 4 行结束后 24 分钟开始,因此(在“预期输出”中)第 5 行得到自己的行的原因
标签: sql sql-server tsql