2016-07-24 3 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 

그리고를 사용하여 적은 전체 코드가 여기에

SELECT 
    MIN(t1.Number) + 1 AS SmallestNumberAfterGap 
FROM 
    @Table t1 
WHERE 
    NOT EXISTS (SELECT * FROM @Table t2 WHERE t1.Number + 1 = t2.Number) 

EXISTS이 링크입니다 사용 하나입니다입니다 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 
관련 문제