Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jak znaleźć najbardziej pokrywający się okres z zakresami dat

Istnieje kilka podejść do tego. Jeden używa skorelowanych podzapytań. To nie jest zabawne. Zamiast tego użyjmy metody sumy skumulowanej, ponieważ masz Oracle.

Kluczem jest rozpoczęcie od listy sygnatur czasowych o wartości +1 dla początku i -1 dla końca. To proste:

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

Teraz skumulowana suma value informuje o liczbie aktywnych nakładek w danym momencie:

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

To rozwiązuje twój problem. Prawdopodobnie chcesz dodać order by numactives desc w określonych godzinach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać maksimum dla pola na podstawie daty i uzyskać również inne pola?

  2. Jak za pomocą Springa wywołać procedurę składowaną z kursorem ref jako parametrem wyjściowym?

  3. PARTITION BY nie działa w H2 db

  4. Jak uzyskać wartość dbms.output zwróconą przez blok PL-SQL w C#

  5. Wywołaj sparametryzowane zapytanie Oracle z ADODB w klasycznym ASP