Это типичная проблема пробелов и островков, когда вы хотите сгруппировать смежные строки, имеющие одинаковый серийный номер и статус.
Вот стандартный подход, который использует разницу между row_number
s определить группы:
select
serialNumber,
min(beginDateTime) beginDateTime,
max(endDateTime) endDateTime,
statusId,
sum(timeInStateInMilliseconds) timeInStateInMilliseconds
from (
select
t.*,
row_number() over(partition by serialNumber order by beginDateTime) rn1,
row_number() over(partition by serialNumber , statusId order by beginDateTime) rn2
from mytable t
) t
group by serialNumber, statusId, rn1 - rn2