Это проблема пробелов и островков.Для этой версии, я думаю, что разница номеров строк является самым простым решением.Таким образом, это почти решает вашу проблему:
select value, min(date), max(date)
from (select t.*,
row_number() over (order by date) as seqnum,
row_number() over (partition by value order by date) as seqnum_v
from t
) t
group by (seqnum - seqnum_v), value;
Но вы хотите следующий запуск, поэтому нам также нужно lead()
:
select value, min(date) as startdate,
lead(min(date), 1, max(date)) over (order by min(date)) as enddate
from (select t.*,
row_number() over (order by date) as seqnum,
row_number() over (partition by value order by date) as seqnum_v
from t
) t
group by (seqnum - seqnum_v), value;
Ичтобы получить общее время:
select value,
datediff(minute,
min(date),
lead(min(date), 1, max(date)) over (order by min(date))
) as dur_minutes
from (select t.*,
row_number() over (order by date) as seqnum,
row_number() over (partition by value order by date) as seqnum_v
from t
) t
group by (seqnum - seqnum_v), value;