从其他范围中找到最大范围
Find maximum range from other ranges
我有一个 table 描述为
create table range (
x int not null,
y int not null,
check (x < y)
);
Table 充满了这样的范围
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 查询 table,其中 returns 最大连续范围。
select ????? from range
x , y
--------------
1 , 6
7 , 11
12, 15
我需要递归或 window 函数吗?
这是一个缺口和孤岛问题。这个想法是找到每个组的开始位置,然后使用累积和来定义组 ("islands")。然后聚合:
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);
Here 是 SQL Fiddle.
注意:range between
应该处理多个范围在同一日期开始并开始一个感兴趣的时间段的情况。
我有一个 table 描述为
create table range (
x int not null,
y int not null,
check (x < y)
);
Table 充满了这样的范围
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 查询 table,其中 returns 最大连续范围。
select ????? from range
x , y
--------------
1 , 6
7 , 11
12, 15
我需要递归或 window 函数吗?
这是一个缺口和孤岛问题。这个想法是找到每个组的开始位置,然后使用累积和来定义组 ("islands")。然后聚合:
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);
Here 是 SQL Fiddle.
注意:range between
应该处理多个范围在同一日期开始并开始一个感兴趣的时间段的情况。