Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como encontrar o período de tempo mais sobreposto com intervalos de datas


Existem várias abordagens para isso. Um usa subconsultas correlacionadas. Isso não é muito divertido. Em vez disso, vamos usar o método de soma cumulativa porque você tem o Oracle.

A chave é começar com uma lista de carimbos de data/hora com um valor de +1 para um início e -1 para um fim. Isso é facil:
select t.*
from ((select starttime as thetime, 1 as value from table t) union all
      (select endtime, -1 as value from table t)
     ) t

Agora, a soma cumulativa do value informa o número de sobreposições ativas em um determinado momento:
select t.*, sum(value) over (order by thetime) as numactives
from ((select starttime as thetime, 1 as value from table t) union all
      (select endtime, -1 as value from table t)
     ) t

Isso resolve seu problema. Você provavelmente deseja adicionar um order by numactives desc para os tempos específicos.