SQL重叠查询

时间:2019-03-21 21:23:10

标签: sql sqlite

说我有一个包含两列X1和X2的表,其中X1总是小于X2。每行组成一个范围(X1,X2)。几行的X1 / X2范围可能重叠以形成更大的范围(X1n,X2m)。

是否可以使用标准SQL查询以找到所有这些范围?

例如,表可能如下所示:

|x1         |x2       |
-----------------------
|1          |3        |
|2          |4        |
|3          |5        |
|7          |9        |
|8          |27       |
|100        |105      |
-----------------------

预期输出为:

((1, 5), (7, 27), (100, 105))

我感谢我们在正确方向上的帮助。

我正在使用sqlite 3.11.0

1 个答案:

答案 0 :(得分:2)

尝试一下:

SELECT 
t1.x1  AS Start,
MIN(t2.x2) AS End
FROM test t1 
INNER JOIN test t2 ON t1.x1 <= t2.x2
      AND NOT EXISTS(SELECT * FROM test t3 
                     WHERE t2.x2 >= t3.x1 AND t2.x2 < t3.x2) 
WHERE NOT EXISTS(SELECT * FROM test t4 
                 WHERE t1.x1 > t4.x1 AND t1.x1 <= t4.x2) 
GROUP BY t1.x1 

Demo here