2016-07-24 49 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 
相关问题