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