2014-12-03 81 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);