我正在尝试找到此表中最小的缺失数字。
('4', 'club', 'J', 'spade')
在数字列中,您可以看到数字之间存在多个间隙。我需要在最小的差距之后获得数字。因此,在上面的情况下,我需要数字3.因为2是间隙之后的最小数字。
答案 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 ..
;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