本帖最后由 wooden954 于 2011-10-18 13:35:06 编辑

解决方案 »

  1.   

    declare @t table(num int)  
    insert into @t 
    select 1   
    union all 
    select 2   
    union all 
    select 3   
    union all 
    select 4   
    union all 
    select 5   
    union all 
    select 12   
    union all 
    select 17   
    union all 
    select 18   
    union all 
    select 19   
    union all 
    select 20   
    union all 
    select 25     
    select 
         rtrim(a.num) as col,(case when min(b.num)!=a.num then rtrim(min(b.num)) else '' end) as col2 
    from 
        (select t.num from @t t where not exists(select 1 from @t where num=t.num-1)) a,      
        (select t.num from @t t where not exists(select 1 from @t where num=t.num+1)) b  
     where 
         a.num <=b.num  
    group by 
          a.num       
    /*------------ ------------
    1            5
    12           
    17           20
    25           (4 行受影响)*/
      

  2.   

    declare @t table(num int)  
    insert into @t 
    select 1   
    union all 
    select 2   
    union all 
    select 3   
    union all 
    select 4   
    union all 
    select 5   
    union all 
    select 12   
    union all 
    select 17   
    union all 
    select 18   
    union all 
    select 19   
    union all 
    select 20   
    union all 
    select 25     ;with cte as (
    select *,ROW_NUMBER () over (order by num) as id from @t a
    where not exists (
      select 1 from @t 
      where num = a.num - 1
      )
    ),  cte1 as (
    select *,ROW_NUMBER () over (order by num) as id from @t a
    where not exists (
      select 1 from @t 
      where num = a.num + 1
      )
      )
    select cte.num ,cte1.num  from cte ,cte1 
    where cte.id = cte1.id   
      
    --结果
    num num
    1 5
    12 12
    17 20
    25 25
      

  3.   

    Create Table Test (Val int)insert into test (val) values (1)  --1-4
    insert into test (val) values (2)
    insert into test (val) values (3)
    insert into test (val) values (4)  
    insert into test (val) values (7)  --7-9
    insert into test (val) values (8)
    insert into test (val) values (9)
    insert into test (val) values (15)  --15-16
    insert into test (val) values (16)go
    ;with cte as(
    select val,val as val1 from test a where not exists(select 1 from test where val=a.val-1)
    union all
    select a.val,b.val from cte a inner join test b on a.val1=b.val-1
    )select val,max(val1)val1 from cte group by val
    /*
    val         val1
    ----------- -----------
    1           4
    7           9
    15          16(3 行受影响)*/
    go
    drop table test
      

  4.   

    Create Table # (id int identity(1,1),Val int)insert into # (val) values (1)  --1-4
    insert into # (val) values (2)
    insert into # (val) values (3)
    insert into # (val) values (4)  
    insert into # (val) values (7)  --7-9
    insert into # (val) values (8)
    insert into # (val) values (9)
    insert into # (val) values (15)  --15-16
    insert into # (val) values (16)
    select ltrim(min(val))+'-'+ltrim(max(val))
    from
    (
    Select *,val-id v from # a
    )a
    group by  v/*
                              
    ------------------------- 
    1-4
    7-9
    15-16(3 row(s) affected)
    */
      

  5.   

    declare @t table(num int)  
    insert into @t 
    select 1   
    union all 
    select 2   
    union all 
    select 3   
    union all 
    select 4   
    union all 
    select 5   
    union all 
    select 12   
    union all 
    select 17   
    union all 
    select 18   
    union all 
    select 19   
    union all 
    select 20   
    union all 
    select 25     select min(num)start,
           max(num)[end]
    from
    (select num ,num-row_number()over(order by num)as grp
     from @t)as D
    group by grp
    /*
    start       end
    ----------- -----------
    1           5
    12          12
    17          20
    25          25*/
      

  6.   

    可能是我没有说清楚条件,以致答案超出点预期(但会灼情给分)
    条件:
        仅SQL Server 2000语句有效,其它版本的数据库暂不考虑
      

  7.   

    declare @t table(num int)  
    insert into @t 
    select 1   
    union all 
    select 2   
    union all 
    select 3   
    union all 
    select 4   
    union all 
    select 5   
    union all 
    select 12   
    union all 
    select 17   
    union all 
    select 18   
    union all 
    select 19   
    union all 
    select 20   
    union all 
    select 25     select IDENTITY(int,1,1) as id,* into #t from @tselect
     min(num)start,
     max(num)[end]
    from
     (select num ,num-id as grp from #t)as D group by grp     
         
    drop table #t      
    /*start       end
    ----------- -----------
    1           5
    12          12
    17          20
    25          25(4 行受影响)
    */
      

  8.   

    SQL2000方法,Create Table Test (Val int)insert into test (val) values (1)  --1-4
    insert into test (val) values (2)
    insert into test (val) values (3)
    insert into test (val) values (4)  
    insert into test (val) values (7)  --7-9
    insert into test (val) values (8)
    insert into test (val) values (9)
    insert into test (val) values (15)  --15-16
    insert into test (val) values (16)select identity(int,1,1) rn, a.val into #s 
    from Test a
    left join Test b on a.val-1=b.val
    where b.val is nullselect identity(int,1,1) rn, a.val into #e
    from Test a
    left join Test b on a.val=b.val-1
    where b.val is nullselect #s.val '开始',#e.val '结束'
    from #s 
    inner join #e on #s.rn=#e.rn开始          结束
    ----------- -----------
    1           4
    7           9
    15          16
      

  9.   

    http://topic.csdn.net/u/20111018/13/5e338b7e-aeac-4572-bdd0-fe213f85f041.html
    相同的帖子,供大家参考