例如:在一列中有一些数字。问题是找到序列中断的列的行号。
Numbers |
:------- |
1 |
2 |
3 |
5 |
6 |
8 |
11 |
12 |
15 |
答案 0 :(得分: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
答案 1 :(得分: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
答案 2 :(得分:0)
如果我理解这个问题,这是一个经典的Gaps and Islands问题。
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)
答案 3 :(得分:0)
要重新定义需求,目标是提供一个行列表,其中1
列不会继续递增整数序列。换句话说,返回不存在包含Number
减去一行的行的所有行。
一旦你这样说,这很容易:
Number
从技术上讲,SELECT *
FROM MyTable t
WHERE NOT EXISTS (SELECT 0
FROM MyTable
WHERE Number = t.Number - 1)
= 1的行不会继续一个序列(它开始一个),因此它将包含在上面的记录集中。
如果你想删除它,但也能够支持数字序列以任意数字开头的数据情况,可能是或不是1,你只需要知道是否有任何行包含更小的号。
Number