当值在连续时间内没有变化时合并行
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
我需要总结一个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