Här är en metod för att lösa detta problem. Skapa en flagga som avgör om en post inte gör det överlappa med den föregående. Det här är början på en grupp. Ta sedan den kumulativa summan av denna flagga och använd den för att gruppera:
select user_id, min(begin_at) as begin_at, max(end_at) as end_at
from (select s.*, sum(startflag) over (partition by user_id order by begin_at) as grp
from (select s.*,
(case when lag(end_at) over (partition by user_id order by begin_at) >= begin_at
then 0 else 1
end) as startflag
from slots s
) s
) s
group by user_id, grp;
Här är en SQL Fiddle.