计算 SQL 中组的重叠时间(以秒为单位)
Calculate overlap time in seconds for groups in SQL
我有一堆按 ID 分组的时间戳,并输入下面显示的示例数据。
我想找到每组 ID 的 start_time 和 end_time 列之间的重叠时间(以秒为单位)以及每个潜在客户和关注者组合之间的重叠时间。我只想显示每个组的第一条记录的重叠时间,该记录始终是 "lead" 类型。
例如,对于 ID 1,第 3 行中关注者的开始和结束时间与第 1 行中潜在客户的开始和结束时间重叠 193 秒(从 09:00:00 到 09:03:13)。第 3 行中跟随者的时间也与第 2 行中领先者的时间重叠 133 秒(09:01:00 至 2020-05-07 09:03:13)。总共 326 秒 (193+133)
我使用分区子句按 ID 和类型对行进行排名,并按 start_time 作为开始对它们进行排序。
如何获取重叠列?
row# ID type start_time end_time rank. overlap
1 1 lead 2020-05-07 09:00:00 2020-05-07 09:03:34 1 326
2 1 lead 2020-05-07 09:01:00 2020-05-07 09:03:13 2
3 1 follower 2020-05-07 08:59:00 2020-05-07 09:03:13 1
4 2 lead 2020-05-07 11:23:00 2020-05-07 11:33:00 1 540
4 2 follower 2020-05-07 11:27:00 2020-05-07 11:32:00 1
5 3 lead 2020-05-07 14:45:00 2020-05-07 15:00:00 1 305
6 3 follower 2020-05-07 14:44:00 2020-05-07 14:44:45 1
7 3 follower 2020-05-07 14:50:00 2020-05-07 14:55:05 2
在你的例子中,时间完全覆盖了总持续时间。如果这始终为真,您可以使用以下逻辑:
select id,
(sum(datediff(second, start_time, end_time) -
datediff(second, min(start_time), max(end_time)
) as overlap
from t
group by id;
要将其添加为附加列,请在上述查询的结果中使用 window 函数或 join
。
如果整体时间有差距,那么问题就比较复杂了。我建议您提出一个 new 问题并为该问题设置数据库 fiddle。
尝试了几种方法并使其正常工作。
我首先加入了 2 tables 与每种类型的单独记录,'lead' 和 'follower' 并创建了一个案例语句来计算每个潜在客户和关注者开始时间的最大开始时间每个领导和追随者结束时间组合的组合和最短结束时间。将其存储在临时 table.
中
CASE
WHEN lead_table.start_time > follower_table.start_time THEN lead_table.start_time
WHEN lead_table.start_time < follower_table.start_time THEN patient_table.start_time_local
ELSE 0
END as overlap_start_time,
CASE
WHEN follower_table.end_time < lead_table.end_time THEN follower_table.end_time
WHEN follower_table.end_time > lead_table.end_time THEN lead_table.end_time
ELSE 0
END as overlap_end_time
然后创建一个外部查询来查找刚刚创建的临时文件 table 以找出每个潜在客户和关注者组合的开始时间和结束时间之间的差异(以秒为单位)
select temp_table.id,
temp_table.overlap_start_time,
temp_table.overlap_end_time,
DATEDIFF_BIG(second,
temp_table.overlap_start_time,
temp_table.overlap_end_time) as overlap_time FROM temp_table
我有一堆按 ID 分组的时间戳,并输入下面显示的示例数据。
我想找到每组 ID 的 start_time 和 end_time 列之间的重叠时间(以秒为单位)以及每个潜在客户和关注者组合之间的重叠时间。我只想显示每个组的第一条记录的重叠时间,该记录始终是 "lead" 类型。
例如,对于 ID 1,第 3 行中关注者的开始和结束时间与第 1 行中潜在客户的开始和结束时间重叠 193 秒(从 09:00:00 到 09:03:13)。第 3 行中跟随者的时间也与第 2 行中领先者的时间重叠 133 秒(09:01:00 至 2020-05-07 09:03:13)。总共 326 秒 (193+133)
我使用分区子句按 ID 和类型对行进行排名,并按 start_time 作为开始对它们进行排序。
如何获取重叠列?
row# ID type start_time end_time rank. overlap
1 1 lead 2020-05-07 09:00:00 2020-05-07 09:03:34 1 326
2 1 lead 2020-05-07 09:01:00 2020-05-07 09:03:13 2
3 1 follower 2020-05-07 08:59:00 2020-05-07 09:03:13 1
4 2 lead 2020-05-07 11:23:00 2020-05-07 11:33:00 1 540
4 2 follower 2020-05-07 11:27:00 2020-05-07 11:32:00 1
5 3 lead 2020-05-07 14:45:00 2020-05-07 15:00:00 1 305
6 3 follower 2020-05-07 14:44:00 2020-05-07 14:44:45 1
7 3 follower 2020-05-07 14:50:00 2020-05-07 14:55:05 2
在你的例子中,时间完全覆盖了总持续时间。如果这始终为真,您可以使用以下逻辑:
select id,
(sum(datediff(second, start_time, end_time) -
datediff(second, min(start_time), max(end_time)
) as overlap
from t
group by id;
要将其添加为附加列,请在上述查询的结果中使用 window 函数或 join
。
如果整体时间有差距,那么问题就比较复杂了。我建议您提出一个 new 问题并为该问题设置数据库 fiddle。
尝试了几种方法并使其正常工作。
我首先加入了 2 tables 与每种类型的单独记录,'lead' 和 'follower' 并创建了一个案例语句来计算每个潜在客户和关注者开始时间的最大开始时间每个领导和追随者结束时间组合的组合和最短结束时间。将其存储在临时 table.
中CASE
WHEN lead_table.start_time > follower_table.start_time THEN lead_table.start_time
WHEN lead_table.start_time < follower_table.start_time THEN patient_table.start_time_local
ELSE 0
END as overlap_start_time,
CASE
WHEN follower_table.end_time < lead_table.end_time THEN follower_table.end_time
WHEN follower_table.end_time > lead_table.end_time THEN lead_table.end_time
ELSE 0
END as overlap_end_time
然后创建一个外部查询来查找刚刚创建的临时文件 table 以找出每个潜在客户和关注者组合的开始时间和结束时间之间的差异(以秒为单位)
select temp_table.id,
temp_table.overlap_start_time,
temp_table.overlap_end_time,
DATEDIFF_BIG(second,
temp_table.overlap_start_time,
temp_table.overlap_end_time) as overlap_time FROM temp_table