sql >> Base de Datos >  >> RDS >> Oracle

Cómo encontrar el período de tiempo más superpuesto con rangos de fechas

Hay varios enfoques para esto. Uno usa subconsultas correlacionadas. Eso no es muy divertido. En su lugar, usemos el método de suma acumulativa porque tiene Oracle.

La clave es comenzar con una lista de marcas de tiempo con un valor de +1 para un inicio y -1 para un final. Esto es fácil:

select t.*
from ((select starttime as thetime, 1 as value from table t) union all
      (select endtime, -1 as value from table t)
     ) t

Ahora, la suma acumulada del value le dice el número de superposiciones activas en un momento dado:

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

Esto resuelve tu problema. Probablemente desee agregar un order by numactives desc para los tiempos específicos.