Đây là một vấn đề khoảng trống và đảo. Một phương pháp để giải nó sử dụng 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);
Nó là một chút khó khăn để giải thích cách này hoạt động. Đề xuất của tôi là chạy truy vấn con và bạn sẽ thấy sự khác biệt của số hàng xác định các nhóm mà bạn đang tìm kiếm như thế nào.