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

从整数表中提取范围的SQL查询,sql,select,sequence,gaps-and-islands,ansi-sql,Sql,Select,Sequence,Gaps And Islands,Ansi Sql,这可能已经在这里得到了回答,但我不知道如何搜索它,所以我道歉,如果它是重复的。我有一个带有整数列的表,它按顺序保存数字 由于删除行,某些数字丢失: +-------+ | _auto | +-------+ | 0 | | 1 | | 2 | | 5 | | 6 | | 7 | | 9 | | 11 | | 12 | | 13 | | 14 | | 16 | | 17 | | 19 | | 20

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

由于删除行,某些数字丢失:

+-------+
| _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) 联合这两个选择


但是我不知道如何写前两个选择。

数字序列有一个特性:如果你从中减去一个序列,那么结果是一个常数。以下查询使用此观察结果:

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);