--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
你的运行结果能解释下么?start end 啥意思?有什么规律没?
如果是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 */
估计楼主的意思是,相同的groupname,求连续的no范围,然后对这个范围的score求和把
估计楼主的意思是,相同的groupname,求连续的no范围,然后对这个范围的score求和把是的
其实这个代码最关键的就是求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是连续的,那么差值就一样
其实这个代码最关键的就是求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是连续的,那么差值就一样讲的很好 结贴给分
--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
--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
*/
估计楼主的意思是,相同的groupname,求连续的no范围,然后对这个范围的score求和把
估计楼主的意思是,相同的groupname,求连续的no范围,然后对这个范围的score求和把是的
其实这个代码最关键的就是求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是连续的,那么差值就一样
其实这个代码最关键的就是求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是连续的,那么差值就一样讲的很好 结贴给分