计算 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