当值在连续时间内没有变化时合并行

Merge rows when value doesn't change in continuous time

我需要总结一个table,其中包含以下信息:Serial Number、StartDate、EndDate、StatusID 和 TimeInState,我需要的是合并在连续时间内保持相同 StatusId 的行(EndDate of row 与另一个的 StartDate 相同),例如,对于这种情况:

我需要输出这个:

我还不能提出解决方案,因为我认为我不能使用 Group By,我需要在 StatusId 不连续更改时合并具有特定 SerialNumber 的行。

这是一个典型的间隙和孤岛问题,您希望将具有相同序列号和状态的相邻行组合在一起。

这是一种标准方法,它使用 row_number 之间的差异来识别组:

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