declare @n int
set @n=11
select top 1 * from (
select a.f,b.f x from t a
left join t b on a.f=b.f-1
) a
where f>@n and x is null
order by f

解决方案 »

  1.   

    select * from table  a
      where not  exists (select 1 from tble  where yy=a.yy+1)
      

  2.   


    create table ap(num int)insert into ap(num)
     select 1 union all
     select 2 union all
     select 3 union all
     select 4 union all
     select 5 union all
     select 6 union all
     select 7 union all
     select 9 union all
     select 10 union all
     select 11 union all
     select 12 union all
     select 13 union all
     select 14 union all
     select 15 union all
     select 18 union all
     select 19 union all
     select 20 union all
     select 21
    -- 建函数
    create function dbo.fn_maxnum
    (@x int) returns int
    as
    begin
    declare @y int;with t as
    (select num,
            row_number() over(order by  num) 'rn' 
     from ap)
    select top 1 @y=num
    from
    (select a.num 
     from t a
     left join t b on a.rn=b.rn-1
     where b.num-a.num<>1 or b.rn is null) t
    where num>=@xreturn @y
    end
    -- 建输入表
    create table #t(x int)
    insert into #t(x)
     select 1 union all
     select 2 union all
     select 3 union all
     select 4 union all
     select 5 union all
     select 6 union all
     select 7 union all
     select 9 union all
     select 10 union all
     select 11 union all
     select 12 union all
     select 13 union all
     select 14 union all
     select 15 union all
     select 18 union all
     select 19 union all
     select 20 union all
     select 21
    -- 调用函数
    select x,dbo.fn_maxnum(x) 'y' from #t-- 结果
    /*
    x           y
    ----------- -----------
    1           7
    2           7
    3           7
    4           7
    5           7
    6           7
    7           7        --> 输入 1-7 都应该找到7
    9           15
    10          15
    11          15
    12          15
    13          15
    14          15
    15          15       --> 输入9-15 都应该找到 15
    18          21
    19          21
    20          21
    21          21       --> 输入18-21 应该找到21(18 row(s) affected)
    */
      

  3.   

    例子:--测试数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',2
    UNION ALL SELECT 'a',3
    UNION ALL SELECT 'a',6
    UNION ALL SELECT 'a',7
    UNION ALL SELECT 'a',8
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',5
    UNION ALL SELECT 'b',6
    UNION ALL SELECT 'b',7
    GO--缺号分布查询
    SELECT a.col1,start_col2=a.col2+1,
    end_col2=(
    SELECT MIN(col2) FROM tb aa
    WHERE col1=a.col1 AND col2>a.col2 
    AND NOT EXISTS(
    SELECT * FROM tb WHERE col1=aa.col1 AND col2=aa.col2-1))
    -1
    FROM(
    SELECT col1,col2 FROM tb
    UNION ALL --为每组编号补充查询起始编号是否缺号的辅助记录
    SELECT DISTINCT col1,0 FROM tb
    )a,(SELECT col1,col2=MAX(col2) FROM tb GROUP BY col1)b
    WHERE a.col1=b.col1 AND a.col2<b.col2 --过滤掉每组数据中,编号最大的记录
    AND NOT EXISTS(
    SELECT * FROM tb WHERE col1=a.col1 AND col2=a.col2+1)
    ORDER BY a.col1,start_col2
    /*--结果
    col1       start_col2  end_col2    
    -------------- -------------- ----------- 
    a          1           1
    a          4           5
    b          2           4
    --*/
    --测试数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',2
    UNION ALL SELECT 'a',3
    UNION ALL SELECT 'a',6
    UNION ALL SELECT 'a',7
    UNION ALL SELECT 'a',8
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',5
    UNION ALL SELECT 'b',6
    UNION ALL SELECT 'b',7
    GO--缺号分布查询
    SELECT a.col1,start_col2=a.col2+1,
    end_col2=(
    SELECT MIN(col2) FROM tb aa
    WHERE col1=a.col1 AND col2>a.col2 
    AND NOT EXISTS(
    SELECT * FROM tb WHERE col1=aa.col1 AND col2=aa.col2-1))
    -1
    FROM(
    SELECT col1,col2 FROM tb
    UNION ALL --为每组编号补充查询起始编号是否缺号的辅助记录
    SELECT DISTINCT col1,0 FROM tb
    )a,(SELECT col1,col2=MAX(col2) FROM tb GROUP BY col1)b
    WHERE a.col1=b.col1 AND a.col2<b.col2 --过滤掉每组数据中,编号最大的记录
    AND NOT EXISTS(
    SELECT * FROM tb WHERE col1=a.col1 AND col2=a.col2+1)
    ORDER BY a.col1,start_col2
    /*--结果
    col1       start_col2  end_col2    
    -------------- -------------- ----------- 
    a          1           1
    a          4           5
    b          2           4
    --*/
     
    让你望见影子<[email protected]>  9:49:01
    --生成已用编号分布字符串的函数
    CREATE FUNCTION f_GetStrSeries(@col1 varchar(10))
    RETURNS varchar(8000)
    AS
    BEGIN
    DECLARE @re varchar(8000),@pid int
    SELECT @re='',@pid=-1
    SELECT @re=CASE 
    WHEN col2=@pid+1 THEN @re
    ELSE @re
    +CASE 
    WHEN RIGHT(@re,CHARINDEX(',',REVERSE(@re)+',')-1)=@pid THEN ''
    ELSE CAST(-@pid as varchar)
    END
    +','+CAST(col2 as varchar) 
    END,
    @pid=col2
    FROM tb
    WHERE col1=@col1
    ORDER BY col2
    RETURN(STUFF(@re,1,2,'')
    +CASE 
    WHEN RIGHT(@re,CHARINDEX(',',REVERSE(@re)+',')-1)=@pid THEN ''
    ELSE CAST(-@pid as varchar)
    END)
    END
    GO--生成缺号分布字符串的函数
    CREATE FUNCTION f_GetStrNSeries(@col1 varchar(10))
    RETURNS VARCHAR(8000)
    AS
    BEGIN
    DECLARE @re varchar(8000),@pid int
    SELECT @re='',@pid=0
    SELECT @re=CASE 
    WHEN col2=@pid+1 THEN @re
    ELSE @re+','+CAST(@pid+1 as varchar)
    +CASE 
    WHEN @pid+1=col2-1 THEN ''
    ELSE CAST(1-col2 as varchar)
    END
    END,
    @pid=col2
    FROM tb
    WHERE col1=@col1
    ORDER BY col2
    RETURN(STUFF(@re,1,1,''))
    END
    GO--调用测试
    --测试数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',2
    UNION ALL SELECT 'a',3
    UNION ALL SELECT 'a',5
    UNION ALL SELECT 'a',8
    UNION ALL SELECT 'a',9
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',5
    UNION ALL SELECT 'b',6
    UNION ALL SELECT 'b',7--查询
    SELECT col1,
    col2_Series=dbo.f_GetStrSeries(col1),
    col2_Series=dbo.f_GetStrNSeries(col1)
    FROM tb
    GROUP BY col1
    /*--结果
    col1       col2_Series       col2_Series 
    -------------- ------------------------ --------------
    a          2-3,5,8-9        1,4,6-7
    b          1,5-7           2-4
    --*/
      

  4.   

    借版主的生成例子数据的sql验证了一下,都正确:declare @t table (f int)
     
    insert into @t(f)
     select 1 union all
     select 2 union all
     select 3 union all
     select 4 union all
     select 5 union all
     select 6 union all
     select 7 union all
     select 9 union all
     select 10 union all
     select 11 union all
     select 12 union all
     select 13 union all
     select 14 union all
     select 15 union all
     select 18 union all
     select 19 union all
     select 20 union all
     select 21
     
    declare @n int
    set @n=1 --7,11,18
    select top 1 * from (
    select a.f,b.f x from @t a
    left join @t b on a.f=b.f-1
    ) a
    where f>@n and x is null
    order by f
      

  5.   

    use master
    go
    --借用楼上测试数据
    --测试数据
    CREATE TABLE tb(col1 varchar(10),col2 int)
    INSERT tb SELECT 'a',2
    UNION ALL SELECT 'a',3
    UNION ALL SELECT 'a',6
    UNION ALL SELECT 'a',7
    UNION ALL SELECT 'a',8
    UNION ALL SELECT 'b',1
    UNION ALL SELECT 'b',5
    UNION ALL SELECT 'b',6
    UNION ALL SELECT 'b',7
    GO
    --提供一个新思路
    select
    col1,ltrim(MIN(col2))+'-'+ltrim(MAX(col2)) as arr
    from(
    select 
    col1,col2,col2-ROW_NUMBER()over(partition by col1 order by col2 asc) as arr 
    from tb)t group by col1,arr 
    order by 1
    /*
    col1 arr
    -------------------------
    a 2-3
    a 6-8
    b 1-1
    b 5-7
    */
    drop table tb
      

  6.   

    with a(a)as(
     --借用楼上数据
     select 1 union all
     select 2 union all
     select 3 union all
     select 4 union all
     select 5 union all
     select 6 union all
     select 7 union all
     select 9 union all
     select 10 union all
     select 11 union all
     select 12 union all
     select 13 union all
     select 14 union all
     select 15 union all
     select 18 union all
     select 19 union all
     select 20 union all
     select 21
    ),b as(
    select a,a-ROW_NUMBER()over(order by a) num from a
    )
    select a,(select MAX(a) from b where num=b1.num) from b b1
      

  7.   

    大家的答案怎么这么麻烦,我的有谁没有看懂,借用例子:create table #t(x int)
    insert into #t(x)
     select 1 union all
     select 2 union all
     select 3 union all
     select 4 union all
     select 5 union all
     select 6 union all
     select 7 union all
     select 9 union all
     select 10 union all
     select 11 union all
     select 12 union all
     select 13 union all
     select 14 union all
     select 15 union all
     select 18 union all
     select 19 union all
     select 20 union all
     select 21
     
    selec t x  from   #t a
      where not  exists (select 1 from #t  where x=a.x+1)答案:
    7
    15
    21