如何确定列中的数据是否按顺序排列?

时间:2016-12-19 20:02:17

标签: sql sql-server sequence

例如:在一列中有一些数字。问题是找到序列中断的列的行号。

Numbers  | 
:------- | 
1        | 
2        |
3        |
5        |
6        | 
8        |
11       |
12       |
15       |

enter image description here

4 个答案:

答案 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