如何在SQL Server中查找数字序列中的间隙

时间:2016-07-24 00:22:06

标签: sql sql-server sql-server-2014

我正在尝试找到此表中最小的缺失数字。

('4', 'club', 'J', 'spade')

在数字列中,您可以看到数字之间存在多个间隙。我需要在最小的差距之后获得数字。因此,在上面的情况下,我需要数字3.因为2是间隙之后的最小数字。

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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

答案 2 :(得分: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