【发布时间】:2011-12-09 21:30:06
【问题描述】:
假设我有一个包含两列的表:start 和 end,都是整数,并且该表按第一列排序,然后是第二列。每行代表一个区间。
我需要的是合并区间表:所有重叠或相邻的区间合并为一个。
它可以用 JOIN 查询来构造,但行数是二次方的,在我的例子中是 400 万行(我决定编写这个问题,因为查询仍在运行)。
它也可以在单次中完成,通过运行每一行并跟踪最大结束时间——但是如何在标准 SQL 中做到这一点,或者类似的东西?在 SQL 中有 any O(n) 方法吗?我现在正在使用 SQLite;这一次,一个特定于 SQLite 的解决方案也会帮助我。
从相关问题的答案(1、2、3、4、5、6、7、8、9)我不能告诉它是否可能。
你可以吗?
【问题讨论】:
-
我可以想办法使用公用表表达式或递归查询来完成此任务,但 SQLite 不支持这些功能。 PostgreSQL 确实如此 :)
-
速度是否胜过一切?为了速度,临时表或其他东西可以吗?
-
什么是最小可能的“开始”和最大可能的“结束”?或者你的情况根本没有限制?这些值是否有已知限制? (即使没有实际用于表中的区间)
-
使用临时表很好。第一个开始和最后一个结束相距约400万个单位(巧合),而同一行内的最大差异通常为1或2,但峰值为1000。
-
sqlite 允许您在主机编程语言中创建用户定义的函数。考虑到您可以创建聚合函数,您可以一次性完成。但是,考虑到嵌入了 sqlite,我不确定这比仅获取所有数据并在宿主语言中使用循环要好多少。
标签: sql sqlite overlapping intervals