首页 > 解决方案 > 分组数据以创建范围列

问题描述

我有下表:

Row   Column   Type
1     1        =
1     2        =
1     3        O
1     4        =
1     5        =
1     6        O
2     1        =

我需要得到类似的东西

Row   Start_Column   End_Column   Type
1     1              2           =
1     3              3           O
1     4              5           =
1     6              6           O
2     1              1           =

我试图对它进行分组,用 ROW_NUMBER、RANK 进行操作,但没有运气

有谁知道如何做到这一点?

标签: sqlsql-server

解决方案


这是一种差距和孤岛问题。在这种情况下,最简单的方法可能是行号的差异:

select row, type, min(column), max(column)
from (select t.*,
             row_number() over (partition by row, type order by column) as seqnum_2,
             row_number() over (partition by row order by column) as seqnum
      from t
     ) t
group by row, type, (seqnum - seqnum_2)
order by row, min(column);

如果column是连续的,没有间隙,您可以进一步简化:

select row, type, min(column), max(column)
from (select t.*,
             row_number() over (partition by row, type order by column) as seqnum_2
      from t
     ) t
group by row, type, (column - seqnum_2)
order by row, min(column);

为什么这行得通?好吧,如果你从 中减去一个递增的序列column,那么结果是恒定的——当类型相同时。

是一个 db<>fiddle。


推荐阅读