下面的示例数据
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/