本帖最后由 cqnucsmoon 于 2009-12-08 18:10:38 编辑

解决方案 »

  1.   


    --tryselect lbm, min(id),max(id),count(1) from 表
       group by lbm..
      

  2.   

    测试数据太少看不出效果
    --> 测试时间:2009-12-08 18:15:06
    --> 测试菜鸟:l8r
    --> 我的淘宝:《戒色坊》http://shop36766744.taobao.com/if object_id('[TB]') is not null drop table [TB]
    create table [TB]([LBM] varchar(3),[ID] bigint)
    insert [TB]
    select '001',100000000000001 union all
    select '001',100000000000002 union all
    select '001',100000000000004 union all
    select '001',100000000000005 union all
    select '001',100000000000066 union all
    select '002',200000000000001 union all
    select '002',200000000000004 union all
    select '002',200000000000006 union all
    select '002',200000000000009 union all
    select '002',200000000000071
    select  LBM,
    BeginID=max(case when flag=1 then ID else 0 end),
    EndID=max(case when flag=30 then ID else 0 end)
    from (select *,flag=(select count(1) from TB where LBM=t.LBM and ID<=t.ID)%30 from TB T)g
    group by LBM
    /*
    LBM  BeginID              EndID                
    ---- -------------------- -------------------- 
    001  100000000000001      0
    002  200000000000001      0(所影响的行数为 2 行)*/drop table [TB]
      

  3.   


    --未测试
    ;with a as (
    select *,idx=row_number() over(partition by LBM order by ID) from tb 
    )
    select a1.*,a2.ID 
    from a a1,a a2
    where a1.LBM=a2.LBM 
    and a1.idx%30=1
    and a1.idx/30=a2.idx/30
    and (a2.idx%30=0 or a2.idx=(select max(idx) from a where LBM=a1.LBM))
      

  4.   

    --忘了还有统计列Num
    ;with a as (
    select *,idx=row_number() over(partition by LBM order by ID) from tb 
    )
    select a1.*,a2.ID,Num=a2.idx-a1.idx+1
    from a a1,a a2
    where a1.LBM=a2.LBM 
    and a1.idx%30=1
    and a1.idx/30=a2.idx/30
    and (a2.idx%30=0 or a2.idx=(select max(idx) from a where LBM=a1.LBM))
      

  5.   

    -------------------------------------
    --  Author : liangCK 梁爱兰
    --  Comment: 小梁 爱 兰儿
    --  Date   : 2009-12-08 18:30:59
    -------------------------------------
     
    --> 生成测试数据: @tb
    DECLARE @tb TABLE (LBM varchar(3),ID bigint)
    INSERT INTO @tb
    SELECT '001',100000000000001 UNION ALL
    SELECT '001',100000000000002 UNION ALL
    SELECT '001',100000000000003 UNION ALL
    SELECT '001',100000000000004 UNION ALL
    SELECT '001',100000000000005 UNION ALL
    SELECT '001',100000000000006 UNION ALL
    SELECT '001',100000000000007 UNION ALL
    SELECT '001',100000000000008 UNION ALL
    SELECT '001',100000000000009 UNION ALL
    SELECT '001',100000000000010 UNION ALL
    SELECT '001',100000000000011 UNION ALL
    SELECT '001',100000000000012 UNION ALL
    SELECT '001',100000000000013 UNION ALL
    SELECT '001',100000000000014 UNION ALL
    SELECT '001',100000000000015 UNION ALL
    SELECT '001',100000000000016 UNION ALL
    SELECT '001',100000000000017 UNION ALL
    SELECT '001',100000000000018 UNION ALL
    SELECT '001',100000000000019 UNION ALL
    SELECT '001',100000000000020 UNION ALL
    SELECT '001',100000000000021 UNION ALL
    SELECT '001',100000000000022 UNION ALL
    SELECT '001',100000000000023 UNION ALL
    SELECT '001',100000000000024 UNION ALL
    SELECT '001',100000000000025 UNION ALL
    SELECT '001',100000000000026 UNION ALL
    SELECT '001',100000000000027 UNION ALL
    SELECT '001',100000000000028 UNION ALL
    SELECT '001',100000000000029 UNION ALL
    SELECT '001',100000000000030 UNION ALL
    SELECT '001',100000000000031 UNION ALL
    SELECT '001',100000000000032 UNION ALL
    SELECT '001',100000000000033 UNION ALL
    SELECT '001',100000000000034 UNION ALL
    SELECT '001',100000000000035 UNION ALL
    SELECT '001',100000000000036 UNION ALL
    SELECT '001',100000000000037 UNION ALL
    SELECT '001',100000000000038 UNION ALL
    SELECT '001',100000000000039 UNION ALL
    SELECT '001',100000000000040 UNION ALL
    SELECT '001',100000000000041 UNION ALL
    SELECT '001',100000000000042 UNION ALL
    SELECT '001',100000000000043 UNION ALL
    SELECT '001',100000000000044 UNION ALL
    SELECT '001',100000000000045 UNION ALL
    SELECT '001',100000000000046 UNION ALL
    SELECT '001',100000000000047 UNION ALL
    SELECT '001',100000000000048 UNION ALL
    SELECT '001',100000000000049 UNION ALL
    SELECT '001',100000000000050 UNION ALL
    SELECT '001',100000000000051 UNION ALL
    SELECT '001',100000000000052 UNION ALL
    SELECT '001',100000000000053 UNION ALL
    SELECT '001',100000000000054 UNION ALL
    SELECT '001',100000000000055 UNION ALL
    SELECT '001',100000000000056 UNION ALL
    SELECT '001',100000000000057 UNION ALL
    SELECT '001',100000000000058 UNION ALL
    SELECT '001',100000000000059 UNION ALL
    SELECT '001',100000000000060 UNION ALL
    SELECT '001',100000000000061 UNION ALL
    SELECT '001',100000000000062 UNION ALL
    SELECT '001',100000000000063 UNION ALL
    SELECT '001',100000000000064 UNION ALL
    SELECT '001',100000000000065 UNION ALL
    SELECT '001',100000000000066 UNION ALL
    SELECT '002',200000000000001 UNION ALL
    SELECT '002',200000000000002 UNION ALL
    SELECT '002',200000000000003 UNION ALL
    SELECT '002',200000000000004 UNION ALL
    SELECT '002',200000000000005 UNION ALL
    SELECT '002',200000000000006 UNION ALL
    SELECT '002',200000000000007 UNION ALL
    SELECT '002',200000000000008 UNION ALL
    SELECT '002',200000000000009 UNION ALL
    SELECT '002',200000000000010 UNION ALL
    SELECT '002',200000000000011 UNION ALL
    SELECT '002',200000000000012 UNION ALL
    SELECT '002',200000000000013 UNION ALL
    SELECT '002',200000000000014 UNION ALL
    SELECT '002',200000000000015 UNION ALL
    SELECT '002',200000000000016 UNION ALL
    SELECT '002',200000000000017 UNION ALL
    SELECT '002',200000000000018 UNION ALL
    SELECT '002',200000000000019 UNION ALL
    SELECT '002',200000000000020 UNION ALL
    SELECT '002',200000000000021 UNION ALL
    SELECT '002',200000000000022 UNION ALL
    SELECT '002',200000000000023 UNION ALL
    SELECT '002',200000000000024 UNION ALL
    SELECT '002',200000000000025 UNION ALL
    SELECT '002',200000000000026 UNION ALL
    SELECT '002',200000000000027 UNION ALL
    SELECT '002',200000000000028 UNION ALL
    SELECT '002',200000000000029 UNION ALL
    SELECT '002',200000000000030 UNION ALL
    SELECT '002',200000000000031 UNION ALL
    SELECT '002',200000000000032 UNION ALL
    SELECT '002',200000000000033 UNION ALL
    SELECT '002',200000000000034 UNION ALL
    SELECT '002',200000000000035 UNION ALL
    SELECT '002',200000000000036 UNION ALL
    SELECT '002',200000000000037 UNION ALL
    SELECT '002',200000000000038 UNION ALL
    SELECT '002',200000000000039 UNION ALL
    SELECT '002',200000000000040 UNION ALL
    SELECT '002',200000000000041 UNION ALL
    SELECT '002',200000000000042 UNION ALL
    SELECT '002',200000000000043 UNION ALL
    SELECT '002',200000000000044 UNION ALL
    SELECT '002',200000000000045 UNION ALL
    SELECT '002',200000000000046 UNION ALL
    SELECT '002',200000000000047 UNION ALL
    SELECT '002',200000000000048 UNION ALL
    SELECT '002',200000000000049 UNION ALL
    SELECT '002',200000000000050 UNION ALL
    SELECT '002',200000000000051 UNION ALL
    SELECT '002',200000000000052 UNION ALL
    SELECT '002',200000000000053 UNION ALL
    SELECT '002',200000000000054 UNION ALL
    SELECT '002',200000000000055 UNION ALL
    SELECT '002',200000000000056 UNION ALL
    SELECT '002',200000000000057 UNION ALL
    SELECT '002',200000000000058 UNION ALL
    SELECT '002',200000000000059 UNION ALL
    SELECT '002',200000000000060 UNION ALL
    SELECT '002',200000000000061 UNION ALL
    SELECT '002',200000000000062 UNION ALL
    SELECT '002',200000000000063 UNION ALL
    SELECT '002',200000000000064 UNION ALL
    SELECT '002',200000000000065 UNION ALL
    SELECT '002',200000000000066 UNION ALL
    SELECT '002',200000000000067 UNION ALL
    SELECT '002',200000000000068 UNION ALL
    SELECT '002',200000000000069 UNION ALL
    SELECT '002',200000000000070 UNION ALL
    SELECT '002',200000000000070 UNION ALL
    SELECT '002',200000000000072--SQL查询如下:SELECT LBM,
        MIN(ID) AS MinID,MAX(ID) AS MaxID,
        COUNT(*) AS rowcnt
    FROM @tb
    GROUP BY LBM,(CAST(RIGHT(ID,10) AS int)-1)/30
    ORDER BY LBM,MinID,MaxID/*
    LBM  MinID                MaxID                rowcnt
    ---- -------------------- -------------------- -----------
    001  100000000000001      100000000000030      30
    001  100000000000031      100000000000060      30
    001  100000000000061      100000000000066      6
    002  200000000000001      200000000000030      30
    002  200000000000031      200000000000060      30
    002  200000000000061      200000000000072      12(6 行受影响)*/
      

  6.   

    /*
    *************************************
    *   T-MAC 小编                      *
    *        -->努力成长中              *
    *        -->梦想DBA                 *
    *************************************
    */
    if OBJECT_ID('tb') is not null
    drop table tb 
    go
    create table tb (LBM int, ID int)
    insert tb select 1,1
    insert tb select 1,2
    insert tb select 1,3
    insert tb select 1,5
    insert tb select 1,6
    insert tb select 1,7
    insert tb select 1,8
    insert tb select 1,12
    insert tb select 2,1
    insert tb select 2,2
    insert tb select 2,3
    insert tb select 2,4
    insert tb select 2,8
    insert tb select 2,9
    insert tb select 2,18
    go
    --假设我3个一组...
    with cte as
    (
    select *,rn=ROW_NUMBER()over(PARTITION by LBM order by ID) from tb 
    )
    select LBM,BeginID =MIN(id),EndID=MAX(id),Num=COUNT(*) 
    from cte 
    group by LBM ,(rn-1)/3
    order by LBM 
    /*
    LBM         BeginID     EndID       Num
    ----------- ----------- ----------- -----------
    1           1           3           3
    1           5           7           3
    1           8           12          2
    2           1           3           3
    2           4           9           3
    2           18          18          1*/
    和你的类似 自己换吧 
      

  7.   

    if object_id('[TB]') is not null drop table [TB]
    create table [TB]([LBM] varchar(3),[ID] varchar(20))
    --插入数据
    declare @i int
    select @i = 1
    while @i <= 66
    begin
    insert into [tb]
    select '001','1000000000000'+right('0'+ltrim(@i),2)
    select @i = @i + 1
    endSELECT LBM,
        MIN(ID) AS MinID,MAX(ID) AS MaxID,
        COUNT(*) AS rowcnt
    FROM (select (select count(1) from tb where LBM = t.LBM and id<=t.id) as group_id,* from tb t) h
    GROUP BY LBM,(group_id-1)/30
    --结果
    ----------------------------------------
    001 100000000000001 100000000000030 30
    001 100000000000031 100000000000060 30
    001 100000000000061 100000000000066 6