簡體   English   中英

查找重疊的多行之間的總持續時間(以分鍾為單位)

[英]Find total duration (in minutes) between multiple rows with overlaps

我有下表:

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')

考慮到重疊,我需要知道startend之間的總時間(以分鍾為單位)。 鑒於上表,計算將如下所示:

  • 第 1 行的時間間隔不與任何其他時間重疊,因此我們計算end - start = 84 分鍾
  • 第 2 行的時間間隔不與任何其他時間重疊,因此我們計算end - start = 1 分鍾
  • 第 3、4、5 行的間隔是重疊的,所以我們計算第 5 行的end和第 3 行的start之間的差,即 45 分鍾

總計 = 84 + 1 + 45 = 130 分鍾

我正在使用 SQLite。 到目前為止,我還沒有找到任何解決方案。

使用表的 2 個副本到表本身和聚合的LEFT連接:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM