2014-12-03 31 views
0

这可能已经在这里回答过了,但我不知道如何搜索它,所以如果它是重复的,我很抱歉。我有一个整数列的表,它按顺序保存数字。从整数表中提取范围的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)结合这两个选择。

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

回答

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