Berikut adalah salah satu metode untuk memecahkan masalah ini. Buat bendera yang menentukan apakah satu record tidak tumpang tindih dengan yang sebelumnya. Ini adalah awal dari sebuah grup. Kemudian ambil jumlah kumulatif dari flag ini dan gunakan itu untuk pengelompokan:
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;
Di sini adalah SQL Fiddle.