【问题标题】:SQL Overlap QuerySQL 重叠查询
【发布时间】:2019-03-22 06:32:11
【问题描述】:

假设我有一个包含两列 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

【问题讨论】:

  • 您使用的是什么版本的 SQLite?这可以通过窗口函数实现,而没有窗口函数则更难。
  • 您能否包含一些示例行(以易于导入表格的格式,不是作为图像或其他格式)和基于该数据的所需结果?
  • @GordonLinoff,我正在使用 sqlite3,我已将该信息添加到问题中。
  • @PhillipMartin。 . .唉,你的版本太旧了,不能真正有用。您需要 3.26 或更高版本。
  • @GordonLinoff,我没有嫁给那个版本。 3.26 或更高版本是否简单?

标签: sql sqlite


【解决方案1】:

试试这个:

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

【讨论】:

  • 我应该补充一点,x1nx2m 不一定是已知的,它只是表示假设可能是包含多个 x1/x2 范围的范围的最小值和最大值。
猜你喜欢
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-06
  • 1970-01-01
相关资源
最近更新 更多