sql - 从其他范围中找到最大范围

标签 sql postgresql gaps-and-islands

我有一个表描述为

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 

我需要递归或窗口函数吗?

最佳答案

这是一个差距和孤岛问题。这个想法是找到每个组的开始位置,然后使用累积和来定义组(“岛”)。然后聚合:

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 应该处理多个范围从同一日期开始并开始一个感兴趣的时间段的情况。

关于sql - 从其他范围中找到最大范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51211992/

相关文章:

postgresql - PgAgent 作业未在远程服务器上执行

sql - 根据特定值从sql表中检索行

MySQL UNIQUE 键不工作

java - rs.getInt(1) 无法正常工作

sql - 如何对 SQL 选择执行 boolean 加法

ruby-on-rails - SQL查询(Postgres)正常工作,但不能通过ActiveRecord

sql - 在 SQL 中向 View 添加新列

mysql - 在 mysql select 中显示行数

mysql - 如何使用 MySQL 对连续范围进行分组

mysql - 在预订表中找到足够大的差距