sql >> Database >  >> RDS >> Oracle

Hoe de meeste overlappende periodes met datumbereiken te vinden

Hier zijn verschillende benaderingen voor. Men gebruikt gecorreleerde subquery's. Dat is niet zo leuk. Laten we in plaats daarvan de cumulatieve sommethode gebruiken, omdat je Oracle hebt.

De sleutel is om te beginnen met een lijst met tijdstempels met een waarde van +1 voor een begin en -1 voor een einde. Dit is eenvoudig:

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

Nu, de cumulatieve som van de value vertelt u het aantal actieve overlappingen op een bepaald moment:

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

Dit lost je probleem op. U wilt waarschijnlijk een order by numactives desc voor de specifieke tijden.



  1. Een rij inactief maken in MySQL

  2. Hoe MySQL-code converteren naar PDO-statement?

  3. 2 manieren om tekenreeksen en getallen samen te voegen in MariaDB

  4. Onbekende kolom in 'veldlijst', maar kolom bestaat wel