Вычисление перекрывающихся временных интервалов в SQL между несколькими пользователями - PullRequest
0 голосов
/ 14 ноября 2018

после некоторого времени, проведенного в Интернете, чтобы найти ответ на мою проблему, я решил опубликовать его здесь.

У меня есть таблица, которая содержит интервалы времени, в течение которых некоторые ресурсы недоступны. Я хотел бы извлечь весь промежуток времени, в течение которого все ресурсы не доступны.

В приведенном ниже примере у меня будет: начало: 2018-11-16 12:30:00, конец: 2018-11-16 12: 45: 00

Start                   End                     Resource
-------------------     -------------------     ----------  
2018-11-15 12:00:00     2018-11-15 13:00:00     resource A
2018-11-15 12:00:00     2018-11-15 13:00:00     resource B
2018-11-15 12:30:00     2018-11-15 14:00:00     resource C
2018-11-15 12:00:00     2018-11-15 12:45:00     resource D
2018-11-18 12:00:00     2018-11-18 13:00:00     resource A
2018-11-19 11:40:00     2018-11-19 12:20:00     resource B
2018-11-15 16:00:00     2018-11-15 17:00:00     resource D

У кого-нибудь есть идеи?

Заранее спасибо.

1 Ответ

0 голосов
/ 15 ноября 2018

Если вы знаете количество ресурсов (или оно может быть рассчитано) и нет перекрывающегося диапазона начала / конца для ресурса (т. Е. Вы получили чистые данные):

select Start, "End"
from
 ( -- calculate a Cumulative Sum to get the count of resources unavailable at any point in time
   select Start,
      lead(Start) over (order by Start,  x) as "End", 
      sum(x) over (order by Start,  x rows unbounded preceding) as cnt
   from
    ( -- combine starts & ends into a single table and assigne +/-1 to each row
      select Start,  1 as x
      from tab
      union all 
      select "End", -1 as x
      from tab
    ) as dt
 ) as dt
where cnt = 4 -- find the row where all resources are unavailable
--  where cnt = (select count(*) from resources)
...