例如:在一列中有一些數字。問題是要找到序列中斷列的行號。如何確定列中的數據是否按順序排列?
Numbers |
:------- |
1 |
2 |
3 |
5 |
6 |
8 |
11 |
12 |
15 |
例如:在一列中有一些數字。問題是要找到序列中斷列的行號。如何確定列中的數據是否按順序排列?
Numbers |
:------- |
1 |
2 |
3 |
5 |
6 |
8 |
11 |
12 |
15 |
基於關閉您的樣本數據,這是連續的從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
但是在那個例子中,'5'''也打破了序列? –
你是什麼意思@JuanCarlosOropeza?如果我理解正確,OP想要一個缺失值的第一個實例。 – scsimon
以及OP序列在不止一個地方破裂。 –
不啓動對數據的方法,如果我理解這個問題,這是一個典型的差距和問題羣島。
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開始,無論這是可行的,但可能無法做到高效:
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
不,不管起點如何,@JohnCappelletti解決方案都可以工作。 –
即使沒有中斷點,該解決方案仍會返回最大數量,但沒有任何跡象表明這不是一個突破點。 –
重新表述的要求,我們的目標是提供行的列表,其中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)
什麼版本的sql server? – scsimon
你期望什麼結果? –
搜索差距和島嶼。 –