これがこの問題を解決するための1つの方法です。 1つのレコードがしないかどうかを決定するフラグを作成します 前のものと重複します。これがグループの始まりです。次に、このフラグの累積合計を取得し、それをグループ化に使用します。
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;
こちら SQLフィドルです。