これはギャップと島の問題です。それを解決するための1つの方法は、row_number()
を使用します。 :
select Date, User, min(Time) as start_time, max(time) as end_time,
Location,
listagg(Service, ',') within group (order by service),
count(*) as cnt
from (select t.*,
row_number() over (date order by time) as seqnum,
row_number() over (partition by user, date, location order by time) as seqnum_2
from t
) t
group by Date, User, Location, (seqnum - seqnum_2);
これがどのように機能するかを説明するのは少し難しいです。サブクエリを実行すると、行番号の違いによって、探しているグループがどのように定義されるかがわかります。