我有一个表,其中相同的 ID 可以有多个带有开始时间和结束时间的条目。我如何计算ID花费的总时间。我想要的下表结果是 11 分钟。
身份证 | 开始时间 | 结束时间 |
---|---|---|
123 | 5:30:00 | 5:35:00 |
123 | 5:36:00 | 5:40:00 |
123 | 5:36:00 | 5:40:00 |
123 | 5:36:00 | 5:39:00 |
123 | 5:38:00 | 5:42:00 |
我尝试了一些方法,但我只能处理开始时间相同而不是重叠的情况。
假设开始和停止时间的类型为
timestamp with time zone
并且表格名为 times
,您可以使用多范围魔法和日期算术来找到答案:
SELECT m.id, sum(upper(r.r) - lower(r.r)) AS duration
FROM (SELECT id,
range_agg(tstzrange(start_time, end_time)) AS mr
FROM times
GROUP BY id) AS m
CROSS JOIN LATERAL unnest(m.mr) AS r(r)
GROUP BY m.id;