当前位置: 首页 > 知识库问答 >
问题:

SQL重叠查询

吴子昂
2023-03-14

假设我有一个表,它有两列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))

我非常感谢您在正确方向上对我们的帮助。

我正在使用sqlite3.11.0

共有1个答案

马梓
2023-03-14

试试这个:

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 

这里演示

 类似资料:
  • 问题内容: 我想从间隔与查询中指定的间隔相交的表中提取行。假设我有一个简单的表和两个查询参数,并且,表达查询的最简单方法是什么,以便找到具有至少一个公共元素的所有行? 更新: 为了使预期结果更加清晰,请在下面找到输入值和预期结果的列表。列是 。 问题答案: 更简单:

  • 我知道如何检查其中两个圆是否重叠(它们中心之间的距离小于直径)。我可以对每对圆执行此检查,但我想知道是否有更好的算法(比)更快)。 编辑 圆圈的数目通常是100个左右,重叠不会经常发生。

  • 问题内容: 我有一个具有以下结构的表:ID,Month,Year,Value,每个ID每个月一个条目的值,大多数月份都具有相同的值。 我想为该表创建一个视图,该视图折叠如下所示的相同值:ID,开始月,结束月,开始年,结束年,值,每个值每个ID一行。 要注意的是,如果值发生变化然后又回到原始值,则表中应该有两行 所以: 100 1 2008 80 100 2 2008 80 100 3 2008 9

  • 问题内容: 我在Postgres中有下表,在两列和中有重叠的数据。 从前6行可以看到,两列中的数据值4,5,6和7相交/重叠,需要将其划分为一组。第7-16行和第17-18行将分别标记为组2和3。 结果输出应如下所示: 问题答案: 假设所有对在它们的镜像的组合中也存在和。但是以下解决方案也可以在没有镜像重复对象的情况下正常工作。 简单的情况 所有连接都可以 按单个升序排列 ,不可能出现像我在小提琴

  • 问题内容: 我在数据库中有2个表,这些表具有以下属性: 第二个表是“预订”和“资源”之间的关联实体(即1个预订可以包含许多资源)。属性booking_start和booking_end是带有日期和时间的时间戳。 我是否可以知道如果日期/时间与其他类似resource_id的预订重叠或冲突,我如何能够找到每个resource_id(预订的)? 我以图形方式在纸上涂上答案,以查看它是否可以帮助我形象化

  • 我最近在一次采访中被问到这个问题。 问题陈述:你有两次定期约会。每个约会都包含所需的开始时间、可选的结束时间和重复规则(必需)。下面列出了所有递归规则: 每日:示例:每2天 每周:示例:每3周在星期二 每月:示例:每2个月第17天/每月第三个星期二 每年:示例:每两年4月17日 你必须检查重叠2以上的事件。 我有一个解决日常复发的办法。 首次预约:开始时间:1/3/2018(dd/MM/YYYY)