计算 SQL 中组的重叠时间(以秒为单位)

Posted

技术标签:

【中文标题】计算 SQL 中组的重叠时间(以秒为单位)【英文标题】:Calculate overlap time in seconds for groups in SQL 【发布时间】:2020-05-08 04:37:58 【问题描述】:

我有一堆按 ID 分组的时间戳,然后输入下面显示的示例数据。

我想查找每组 ID 的 start_time 和 end_time 列之间以及每个潜在客户和关注者组合之间的重叠时间(以秒为单位)。我只想显示每个组的第一条记录的重叠时间,这将始终是“领先”类型。

例如,对于 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)

我使用 partition 子句按 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

【问题讨论】:

请定义overlapped 是什么意思。请举例说明和计算 嗨@Squirrel。我添加了一个示例并编辑了原始问题。希望这会有所帮助! the follower's start and end times in row 3 overlap with the lead's in row 1 为什么不考虑 row 3row 2 重叠? leadfollower 有什么意义吗? 我是。第 3 行和第 2 行之间有 133 秒的重叠。我认为在 ID 1 的总重叠中。第 1 行和第 1 行之间的 193 秒 + 133 秒 = 326 秒。 【参考方案1】:

在您的示例中,时间完全涵盖了总持续时间。如果总是这样,您可以使用以下逻辑:

select id,
       (sum(datediff(second, start_time, end_time) -
        datediff(second, min(start_time), max(end_time)
       ) as overlap
from t
group by id;

要将其添加为附加列,请在上述查询的结果中使用窗口函数或join

如果总时间有差距,那么问题就复杂多了。我建议您提出一个 问题并为该问题设置一个 db fiddle。

【讨论】:

嗨,戈登。我添加了一个示例并编辑了原始问题。希望这会有所帮助! @adityatandel 。 . .这个答案有问题吗?如果是这样,请设置一个 dbfiddle 来说明问题。【参考方案2】:

尝试了几种方法并让它工作。

我首先加入了 2 个表,其中包含每种类型的单独记录,“lead”和“follower”,并创建了一个案例语句来计算每个lead 和 follower 开始时间组合的最长开始时间以及每个lead 和 follower 结束的最短结束时间时间组合。将此存储在临时表中。

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

然后创建一个外部查询来查找刚刚创建的临时表,以查找每个潜在客户和跟随者组合的开始时间和结束时间之间的差异(以秒为单位)

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

【讨论】:

以上是关于计算 SQL 中组的重叠时间(以秒为单位)的主要内容,如果未能解决你的问题,请参考以下文章

SQL Datediff 以秒为单位,带小数位

SQL 两次之间的差异(以秒为单位)

在 pyspark 数据框中查找不重叠的窗口

要计算以秒为单位的持续时间的50%?

MySql 以秒为单位的两个时间戳之间的区别?

以秒为单位将数字拆分为天、小时、分钟和秒?