Oracle
 sql >> Base de données >  >> RDS >> Oracle

Comment trouver la période qui se chevauche le plus avec les plages de dates

Il existe plusieurs approches à cela. L'une utilise des sous-requêtes corrélées. Ce n'est pas très amusant. Au lieu de cela, utilisons la méthode de la somme cumulative car vous avez Oracle.

La clé est de commencer avec une liste d'horodatages avec une valeur de +1 pour un début et -1 pour une fin. C'est facile :

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

Maintenant, la somme cumulée de la value vous indique le nombre de chevauchements actifs à un moment donné :

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

Cela résout votre problème. Vous souhaitez probablement ajouter un order by numactives desc pour les heures spécifiques.