Это форма зазоров и островков с изюминкой.Вы можете идентифицировать соседние строки, используя разницу номеров строк.Затем агрегируйте и используйте lead()
, чтобы получить время окончания:
select client, status, min(time) as starttime,
lead(min(time)) over (partition by client order by min(time)) as endtime
from (select t.*,
row_number() over (partition by client order by time) as seqnum,
row_number() over (partition by client, status order by time) as seqnum_s
from t
) t
group by (seqnum - seqnum_s), status, client;