Объединение сегментов - PullRequest
0 голосов
/ 21 июня 2020

У меня есть следующие данные с интервалами. Столбцы 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

1 Ответ

2 голосов
/ 21 июня 2020

Это общая форма промежутков и островов, где вы можете иметь перекрытия.

Вы можете использовать совокупный максимум, чтобы получить предыдущий конец, а затем использовать эту информацию для расчета «островных» начала. Остальное - просто агрегация:

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;

Здесь - скрипт db <>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...