本帖最后由 duwei1990 于 2014-03-15 10:45:05 编辑

解决方案 »

  1.   


    --GroupName NO Score    tb:test
    --以SQL2005为例;with cte as
    (
        select groupname,no,score,
            row_number() over (partition by groupname order by no) - no as rid
        from test
    )select groupname,min(no) as startno,max(no) as endno,sum(score) as score
    from cte
    group by groupname,rid
      

  2.   

    你的运行结果能解释下么?start end 啥意思?有什么规律没?
      

  3.   

    如果是2005,可以试试这个:--drop table Test
    --goCREATE TABLE [dbo].[Test](
    [GroupName] [nvarchar](500) COLLATE Chinese_PRC_CI_AS NULL,
    [NO] [int] NULL,
    [Score] [int] NULL
    ) ON [PRIMARY]INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',1,50)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',2,100)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',9,150)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',3,200)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',4,150)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',8,300)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',12,200)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',13,300)
    INSERT INTO [dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',1,300)
    goselect GroupName,
           MIN(no) [start],
           MAX(NO) [end],
           SUM([Score]) score
    from 
    (
    select *,
           ROW_NUMBER() over(partition by groupname order by no) rownum
    from test
    )t
    group by groupname,NO-rownum
    order by GroupName
    /*
    GroupName start end score
    GroupA 1 4 500
    GroupA 8 9 450
    GroupA 12 12 200
    GroupB 1 1 300
    GroupB 13 13 300
    */
      

  4.   


    估计楼主的意思是,相同的groupname,求连续的no范围,然后对这个范围的score求和把
      

  5.   


    估计楼主的意思是,相同的groupname,求连续的no范围,然后对这个范围的score求和把是的
      

  6.   


    其实这个代码最关键的就是求groupname相同的时候的,no的连续范围,之所以在group by groupname,NO-rownum 这里的rownum是按照groupname分组,然后按照no排序,形成一个序号:1,2,3,4,5,6,7
    这里的groupA一共有7条记录,所以上面是1-7,然后用no减去这个序号,这么计算出来的是间隔,就是no-rownum,计算出来的是两种序号只差,那么group by groupname,no-rownum ,就是把groupname ,no-rownum相同的分组,只要这个间隔值相等的,就会分一组。而分到一组里的no,很有意思,他们的no-rownum是一样的,为什么会一样呢? 就是因为连续,如果no是连续的,那么差值就一样
      

  7.   


    其实这个代码最关键的就是求groupname相同的时候的,no的连续范围,之所以在group by groupname,NO-rownum 这里的rownum是按照groupname分组,然后按照no排序,形成一个序号:1,2,3,4,5,6,7
    这里的groupA一共有7条记录,所以上面是1-7,然后用no减去这个序号,这么计算出来的是间隔,就是no-rownum,计算出来的是两种序号只差,那么group by groupname,no-rownum ,就是把groupname ,no-rownum相同的分组,只要这个间隔值相等的,就会分一组。而分到一组里的no,很有意思,他们的no-rownum是一样的,为什么会一样呢? 就是因为连续,如果no是连续的,那么差值就一样讲的很好 结贴给分