sql >> Databáze >  >> RDS >> Oracle

Získejte obálku, tj. překrývající se časové úseky

Zkuste i tento. Testoval jsem to nejlépe, jak jsem mohl, věřím, že pokrývá všechny možnosti, včetně slučování sousedních intervalů (10:15 až 10:30 a 10:30 až 10:40 jsou sloučeny do jediného intervalu, 10:15 až 10:40 ). Mělo by to být také docela rychlé, moc toho nespotřebuje.

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
/


  1. Jak mohu s MySQL vygenerovat sloupec obsahující index záznamu v tabulce?

  2. Laravel 5 PDOException nemůže najít ovladač

  3. Jak vybrat záznamy z posledních 24 hodin v PostgreSQL

  4. Jak exportovat data serveru SQL z tabulky do souboru CSV