यह एक अंतराल और द्वीपों की समस्या है। इसे हल करने की एक विधि 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);
यह कैसे काम करता है, यह समझाना थोड़ा मुश्किल है। मेरा सुझाव सबक्वेरी चलाने का है और आप देखेंगे कि पंक्ति संख्याओं का अंतर उन समूहों को कैसे परिभाषित करता है जिन्हें आप ढूंढ रहे हैं।