合并段

u5rb5r59  于 2021-08-09  发布在  Java
关注(0)|答案(1)|浏览(214)

我有以下间隔数据。柱 Start 以及 End . Start 总是少一点 End . 间隔可以重叠:

Start       |  End
------------+------------
         0  |         209
      1295  |        1569 
      2344  |        2509 
       207  |         858 
      1226  |        1277 
      1283  |        1285 
      1572  |        2338 
      1502  |        3071

我需要合并间隔和输出在同一格式

Start   |  End
------------+------------
         0  |         858 
      1295  |        3071 
      1226  |        1277 
      1283  |        1285

初始化代码:

CREATE TABLE Periods 
(
    [Start] int NOT NULL,
    [End] int  NOT NULL
)

INSERT INTO Periods ([Start], [End])
SELECT 0, 209
UNION ALL SELECT 1295, 1569
UNION ALL SELECT 2344, 2509
UNION ALL SELECT 207, 858
UNION ALL SELECT 1226,1277
UNION ALL SELECT 1283, 1285
UNION ALL SELECT 1572, 2338
UNION ALL SELECT 1502, 3071
eqqqjvef

eqqqjvef1#

这是可以重叠的间隙和孤岛的一般形式。
您可以使用累积最大值来获取前一个端点,然后使用该信息来计算“孤岛”起点。剩下的只是聚合:

select min(startp), max(endp)
from (select p.*,
             sum(case when prev_endp >= startp then 0 else 1 end) over (order by startp) as grp
      from (select p.*,
                   max(endp) over (order by startp rows between unbounded preceding and 1 preceding) as prev_endp
            from periods p
           ) p
     ) p
group by grp;

这是一把小提琴。

相关问题