Sql 查找具有重叠的多行之间的总持续时间(以分钟为单位)
我有下表:Sql 查找具有重叠的多行之间的总持续时间(以分钟为单位),sql,sqlite,datetime,Sql,Sqlite,Datetime,我有下表: start end ('19:48:43', '21:12:43') ('21:16:36', '21:17:36') ('21:19:22', '21:46:22') ('21:22:41', '22:03:41') ('21:23:29', '22:04:29') 考虑到重叠,我需要知道start和end之间的总时间(以分钟为单位)。根据上表,计算如下: 第1行的间隔不与任何其他行重叠,因此我们计算end-start=84分钟 第2行的间隔不与任何其他行重叠,
start end
('19:48:43', '21:12:43')
('21:16:36', '21:17:36')
('21:19:22', '21:46:22')
('21:22:41', '22:03:41')
('21:23:29', '22:04:29')
考虑到重叠,我需要知道start
和end
之间的总时间(以分钟为单位)。根据上表,计算如下:
- 第1行的间隔不与任何其他行重叠,因此我们计算
-end
=84分钟start
- 第2行的间隔不与任何其他行重叠,因此我们计算
-end
=1分钟start
- 第3、4、5行的间隔重叠,因此我们计算第5行的
和第3行的end
之间的差异,即45分钟start
我正在使用SQLite。到目前为止,我还没有找到任何解决方案。使用左侧的
将表的两个副本连接到表本身并进行聚合:
WITH cte AS (
SELECT DISTINCT
COALESCE(MIN(ts.start), t.start) start,
COALESCE(MAX(te.end), t.end) end
FROM tablename t
LEFT JOIN tablename ts ON t.start BETWEEN ts.start AND ts.end
LEFT JOIN tablename te ON t.end BETWEEN te.start AND te.end
GROUP BY t.start, t.end
)
SELECT SUM(strftime('%s', end) - strftime('%s', start)) / 60 total
FROM cte
或更简单:
WITH cte AS (
SELECT DISTINCT
COALESCE(
(SELECT MIN(t2.start)
FROM tablename t2
WHERE t1.start BETWEEN t2.start AND t2.end), t1.start) start,
COALESCE(
(SELECT MAX(t2.end)
FROM tablename t2
WHERE t1.end BETWEEN t2.start AND t2.end), t1.start) end
FROM tablename t1
)
SELECT SUM(strftime('%s', end) - strftime('%s', start)) / 60 total
FROM cte
请参阅。
结果:
全部的
130
我看到两个独立且不相关的任务-加入时段并计算总长度。非常感谢!!