Найти максимальный диапазон из других диапазонов - PullRequest
0 голосов
/ 06 июля 2018

У меня есть таблица, описанная как

create table range (
    x int not null,
    y int not null,
    check (x < y)
);

Таблица заполнена такими диапазонами, как этот

insert into range(x,y) values (1,5);
insert into range(x,y) values (2,6);
insert into range(x,y) values (2,3);
insert into range(x,y) values (4,6);
insert into range(x,y) values (2,6);

insert into range(x,y) values (9,10);
insert into range(x,y) values (8,11);
insert into range(x,y) values (7,9);

insert into range(x,y) values (12,15);

Я хотел бы запросить таблицу с некоторым выбором, который возвращает максимальные непрерывные диапазоны.

select ????? from range
x , y
--------------
1 , 6
7 , 11
12, 15 

Нужны ли рекурсивные или оконные функции?

1 Ответ

0 голосов
/ 06 июля 2018

Это проблема пробелов и островков. Идея состоит в том, чтобы найти, где начинается каждая группа, а затем использовать кумулятивную сумму для определения групп («островков»). Тогда агрегация:

select min(x) as x, max(y) as y
from (select r.*,
            sum(isstart) over (order by x range between unbounded preceding and current row) as grp
      from (select r.*,
                   (not exists (select 1
                                from range r2
                                where r2.x < r.x and r2.y >= r.x
                               )
                   )::int as isstart
            from range r
           ) r
     ) r
group by grp
order by min(x);

Здесь - это скрипта SQL.

Примечание: range between должен обрабатывать ситуацию, когда несколько диапазонов начинаются в одну и ту же дату и начинают интересующий период.

...