2016-07-24 69 views
1

我正在嘗試查找此表中最小的數字。如何在SQL Server中查找數字序列中的空白

+------+--------+ 
| id | number | 
+------+--------+ 
| 902 | 1 | 
| 908 | 2 | 
| 1007 | 7 | 
| 1189 | 8 | 
| 1233 | 12 | 
| 1757 | 15 | 
+------+--------+ 

在數字列中,您可以看到數字之間有幾個間隔。我需要得到最小差距後的數字。所以在上面的情況下,我需要數字3.因爲2是差距之後的最小數字。

+0

你需要的只是數字或整行嗎? – Serg

回答

3

這裏有很多不同的方法是由於使用窗口函數而可能很受歡迎。

;WITH cte AS (
    SELECT 
     Id 
     ,[Number] 
     ,LAG([Number],1,NULL) OVER (ORDER BY [Number] ASC) AS LagValue 
    FROM 
     @Table 
) 

SELECT 
    MIN(LagValue) + 1 AS SmallestNumberAfterGap 
FROM 
    cte 
WHERE 
    LagValue <> [Number] - 1 

這裏是一個是使用LEFT JOIN

SELECT 
    MIN(t2.[Number]) + 1 AS SmallestNumberAfterGap 
FROM 
    @Table t1 
    LEFT JOIN @Table t2 
    ON t1.Number + 1 = t2.Number 

而且因爲我只是在這裏寫更多的代碼,代碼的總體較少是一個使用EXISTS

SELECT 
    MIN(t1.Number) + 1 AS SmallestNumberAfterGap 
FROM 
    @Table t1 
WHERE 
    NOT EXISTS (SELECT * FROM @Table t2 WHERE t1.Number + 1 = t2.Number) 

這裏是一個鏈接顯示全部3個功能運作 http://rextester.com/TIFRI87282

+0

但只有最後一個返回正確的數字,在我的應用程序 – Joe

+0

@Joe我很抱歉,你不能在你的應用程序中實現這一點,但我已添加一個鏈接到rextester顯示所有3個正常運行,並返回3,如果你有一個特定的問題,你需要幫助,不要猶豫,發佈一個問題,並ping我,我會看看它。 – Matt

4

我會用lead()

select min(id) + 1 
from (select t.*, 
      lead(id) over (order by id) as next_id 
     from t 
    ) t 
where next_id <> id + 1; 

如果你想確保ID從1(所以,如果 「1」 的缺失,則返回)開始,你可以這樣做:

select (case when min(minid) <> 1 then 1 else min(id) + 1 end) 
from (select t.*, min(id) over() as minid 
      lead(id) over (order by id) as next_id 
     from t 
    ) t 
where next_id <> id + 1; 
0

此解決方案讓您從序列缺失的最低數字不是一個單一的數字.. 這將使用numbers table ..

Demo Here

;With cte 
as 
(
select 
* 
from 
Numbers n 
left join 
#t1 
on n.Number=#t1.num 
where n.Number<=(select max(num) from #t1) 

) 
select 
number from cte c1 
join 
#t1 
on #t1.num+1=c1.Number 
where c1.num is null 
相關問題