Вы также можете использовать Табибитозан :
select id,
loc,
to_char(min(start_), 'yyyy-mm-dd hh24:mi:ss') grp_start_time,
to_char(max(end_), 'yyyy-mm-dd hh24:mi:ss') grp_end_time
from (select t.*,
row_number() over (partition by id order by start_, ROWNUM)
- row_number() over (partition by id, loc order by start_, ROWNUM) grp
from t)
group by id, loc, grp
dbfiddle
N.B. Мне пришлось добавить rownum
в порядок с помощью аналитических функций row_number()
, потому что у вас есть строки в ваших данных выборки, которые имеют одинаковое время начала и окончания. Если время начала все разные по строкам для идентификатора и loc, вам не понадобится rownum
в порядке по.
На вашем месте, я бы попробовал оба решения и выяснил, какое из них более эффективно для ваших данных и т. Д. имеет преимущество.)