sql - 在 PL/SQL 中查找重叠范围

标签 sql oracle plsql logic

下面的示例数据

    id   start  end
    a     1      3
    a     5      6
    a     8      9
    b     2      4
    b     6      7
    b     9      10
    c     2      4
    c     6      7
    c     9      10

我正在尝试提出一个查询,该查询将返回 a、b 和 c 之间的所有重叠开始-结束(但可扩展到更多)。所以预期的数据将如下所示

    start  end
     2      3
     6      6
     9      9

我可以想象这一点的唯一方法是使用自定义聚合函数,该函数跟踪当前的有效间隔,然后在迭代阶段计算新的间隔。然而,我认为这种方法在处理大型数据集时并不实用。因此,如果某个聪明的头脑有一个查询或一些我不知道的固有功能,我将非常感谢您的帮助。

最佳答案

您可以使用聚合和连接来完成此操作。假设“a”和“b”没有内部重叠:

select greatest(ta.start, tb.start) as start,
       least(ta.end, tb.end) as end
from t ta join
     t tb
     on ta.start <= tb.end and ta.end >= tb.start and
        ta.id = 'a' and tb.id = 'b';

关于sql - 在 PL/SQL 中查找重叠范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36581337/

相关文章:

java - Oracle JDBC 驱动程序自动格式化日期列

database - 无需查询即可检索 Oracle 数据库名称

sql - 为什么 PLSQL 优化级别没有提供预期结果?

sql - 我需要使用什么 SQL 来列出 Oracle 数据库上的所有存储过程?

sql-server - OLAP 中的锁定问题是什么?

SQL 转换函数返回错误 241

java - 为什么 Oracle Pivot 产生不存在的结果?

xml - 如何从 Oracle 数据库中的对象类型生成 XML

mysql - 针对 max、count 优化 MySQL InnoDB 查询

sql - 调用程序的锁定问题