Hãy thử cái này, quá. Tôi đã thử nghiệm nó tốt nhất có thể, tôi tin rằng nó bao gồm tất cả các khả năng, bao gồm cả việc kết hợp các khoảng liền kề (10:15 đến 10:30 và 10:30 đến 10:40 được kết hợp thành một khoảng duy nhất, 10:15 đến 10:40 ). Nó cũng khá nhanh, nó không sử dụng nhiều.
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
/