2016-12-19 34 views

回答

0

基於關閉您的樣本數據,這是連續的從1開始,您可以使用此。

create table #tt (i int) 
insert into #tt (i) values 
(1),(2),(4),(5) 

;with cte as 
    (select 
     i, 
     ROW_NUMBER() over (order by i) as rn 
    from #tt) 

select top 1 * 
from cte where rn <> i 

這裏是1

if object_id('tempdb..#tt') is not null drop table #tt 
create table #tt (i int) 
insert into #tt (i) values 
(2),(3),(4),(5),(7),(8) 

declare @min int = (select top 1 i from #tt order by i) 

;with cte as 
    (select 
     i, 
     ROW_NUMBER() over (order by i) as rn 
    from #tt) 


select top 1 * 
from cte where rn + (@min - 1) <> i 
+0

但是在那個例子中,'5'''也打破了序列? –

+0

你是什麼意思@JuanCarlosOropeza?如果我理解正確,OP想要一個缺失值的第一個實例。 – scsimon

+0

以及OP序列在不止一個地方破裂。 –

0

不啓動對數據的方法,如果我理解這個問題,這是一個典型的差距和問題羣島。

Declare @YourTable table (Numbers int) 
Insert Into @YourTable values 
(1),(2),(3),(5),(6),(8),(11),(12),(15) 

Select NumR1 = min(Numbers) 
     ,NumR2 = max(Numbers) 
From (
     Select * 
       ,Island = Numbers - Row_Number() over (Order By Numbers) 
     From @YourTable 
    ) A 
Group By Island 
Order By 1 

返回

NumR1 NumR2 
1  3 
5  6 
8  8 
11  12 
15  15 

編輯可選集團後,通過

Having min(Numbers)<>max(Numbers) 

Having min(Numbers)=max(Numbers) 
1

以上答案將工作假設你的序列從1開始,無論這是可行的,但可能無法做到高效:

select min(t1.number) 
from Numbers As t1 
left outer join Numbers As t2 
    on t1.number = t2.number - 1 
where t2.number is null 
+0

不,不管起點如何,@JohnCappelletti解決方案都可以工作。 –

+0

即使沒有中斷點,該解決方案仍會返回最大數量,但沒有任何跡象表明這不是一個突破點。 –

0

重新表述的要求,我們的目標是提供行的列表,其中Number列不會繼續遞增整數序列。換句話說,返回所有不含行的行,其中包含Number減1。

一旦你這樣說的話,這是很容易:

SELECT * 
FROM MyTable t 
WHERE NOT EXISTS (SELECT 0 
        FROM MyTable 
        WHERE Number = t.Number - 1) 

技術上與Number = 1不繼續序列(它開始的),所以它會被包括在上述記錄的行。

如果你想刪除它,但也能夠支持數字序列以任意數字開頭的數據情況,可以是也可以不是1,你只需要知道是否有任何行包含數量較少。

SELECT Number 
FROM MyTable t 
WHERE NOT EXISTS (SELECT 0 
        FROM MyTable 
        WHERE Number = t.Number - 1) 
AND EXISTS  (SELECT 0 
        FROM MyTable 
        WHERE Number < t.Number) 
相關問題