用于从整数表中提取范围的SQL查询

时间:2014-12-03 15:16:44

标签: sql select sequence gaps-and-islands ansi-sql

这可能之前已在这里得到解答,但我不知道如何搜索它,所以我很抱歉,如果它是重复的。我有一个带整数列的表,它按顺序保存数字。

由于删除行而丢失了一些数字:

+-------+
| _auto |
+-------+
|   0   |
|   1   |
|   2   |
|  5    |
|  6    |
|  7    |
|   9   |
|  11   |
|  12   |
|  13   |
|  14   |
|   16  |
|   17  |
|  19   |
|  20   |
+-------+

我想要的是编写SQL查询,它给了我一个包含此列范围的表。

+----+----+
|  F |  T |
+----+----+
|  0 |  2 |
|  5 |  7 |
|  9 |  9 |
| 11 | 14 |
| 16 | 17 |
| 19 | 20 |
+----+----+

我将在QT4 :: QSqlDatabase驱动程序中使用它,所以如果它可以在任何兼容的数据库(ANSI SQL)上工作,而不仅仅是PostgreSQL。

我相信这个算法:(1)选择行,这样就没有值 _auto + 1 的行; (2)相同,但 _auto-1 ; (3)结合这两个选择。

但我不明白如何写前两个选择。

1 个答案:

答案 0 :(得分:2)

数字序列具有属性:如果从中减去序列,则结果为常量。以下查询使用此观察结果:

select min(_auto) as f, max(_auto) as t
from (select n._auto, row_number() over (order by n._auto) as seqnum
      from numbers n
     ) n
group by (_auto - seqnum);