表中记录:
GroupName NO Score
GroupA 1 50
GroupA 2 100
GroupA 9 150
GroupA 3 200
GroupA 4 150
GroupA 8 300
GroupA 12 200
GroupB 13 300
GroupB 1 300
运行结果:
GroupName Start End SUM(Score)
GroupA 1 4 500
GroupA 8 9 450
GroupA 12 12 200
GroupB 1 1 300
GroupB 13 13 300
创建表结构:
CREATE TABLE [dbo].[Test](
[GroupName] [nvarchar](500) COLLATE Chinese_PRC_CI_AS NULL,
[NO] [int] NULL,
[Score] [int] NULL
) ON [PRIMARY]
准备数据:
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',1,50)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',2,100)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',9,150)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',3,200)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',4,150)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',8,300)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupA',12,200)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',13,300)
INSERT INTO [Tabc].[dbo].[Test]([GroupName],[NO],[Score]) VALUES('GroupB',1,300)
------解决方案--------------------
其实这个代码最关键的就是求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是连续的,那么差值就一样