Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Holen Sie sich Umschlag, d. h. überlappende Zeitspannen

Versuchen Sie auch dieses. Ich habe es so gut ich konnte getestet, ich glaube, es deckt alle Möglichkeiten ab, einschließlich der Vereinigung benachbarter Intervalle (10:15 bis 10:30 und 10:30 bis 10:40 werden zu einem einzigen Intervall kombiniert, 10:15 bis 10:40 ). Es sollte auch ziemlich schnell sein, es braucht nicht viel.

with m as
        (
         select ip_address, start_time,
                   max(stop_time) over (partition by ip_address order by start_time 
                             rows between unbounded preceding and 1 preceding) as m_time
         from ip_sessions
         union all
         select ip_address, NULL, max(stop_time) from ip_sessions group by ip_address
        ),
     n as
        (
         select ip_address, start_time, m_time 
         from m 
         where start_time > m_time or start_time is null or m_time is null
        ),
     f as
        (
         select ip_address, start_time,
            lead(m_time) over (partition by ip_address order by start_time) as stop_time
         from n
        )
select * from f where start_time is not null
/