簡體   English   中英

如何在SQL Server中的數字序列中查找空格

[英]How to find gaps in a sequence of numbers in SQL Server

我正嘗試在此表中找到最小的遺漏號碼。

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

在數字列中,您可以看到數字之間存在多個間隙。 我需要在最小間距后得到數字。 因此,在上述情況下,我需要數字3。因為2是間隔后的最小數字。

我會用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”,則返回該ID),可以執行以下操作:

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;

由於使用窗口函數,許多方式在當今可能很流行。

;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

此解決方案將為您提供序列中缺少的最小數字,而不是單個數字..這將使用數字表

在這里演示

;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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM