按行的出现分组
Group by occurrence of row
有一个像下面这样的 table,我必须根据分组依据对 col2 求和。但它属于一个链,如果链断裂则sum将被限制在序列中。
DECLARE @TabVar TABLE
(
ID INT IDENTITY(1,1), col1 varchar(20), Col2 INT
)
INSERT INTO @TabVar
VALUES ('a',2),('a',3),('b',4),('b',2),('a',6),('a',3),('b',3)
SELECT * FROM @TabVar
Expected output:
COL1 SUM(COL2)
A 5
B 6
A 9
B 3
我曾尝试使用排名函数来完成排名,但排名是使用 Order by 累积 Col1 的总数来完成的
您可以使用 ROW_NUMBER()
和 PARTITION BY
,然后使用 GROUP BY
来实现。
每当你的链断裂时,id - ROW_NUMBER()over(partition by col1 order by id)
将具有相同的 col1
值的不同值。然后,您可以将其与 col1
一起使用以对数据进行分组并执行 SUM
。像这样
示例数据
DECLARE @TabVar TABLE
(
ID INT IDENTITY(1,1), col1 varchar(20), Col2 INT
)
INSERT INTO @TabVar
VALUES ('a',2),('a',3),('b',4),('b',2),('a',6),('a',3),('b',3)
查询
SELECT Col1,SUM(Col2) sumcol
FROM
(
SELECT id - ROW_NUMBER()over(partition by col1 order by id) grpcol,Col1,Col2,id
FROM @TabVar
)T
GROUP BY grpcol,Col1
ORDER BY MAX(ID)
输出
Col1 sumcol
a 5
b 6
a 9
b 3
编辑
如果你的ID
在现场环境中不连续,你可以使用这个
SELECT Col1,SUM(Col2) sumcol
FROM
(
SELECT ROW_NUMBER()over(order by id) - ROW_NUMBER()over(partition by col1 order by id) grpcol, Col1,Col2,id
FROM @TabVar
)T
GROUP BY grpcol,Col1
ORDER BY MAX(ID)
有一个像下面这样的 table,我必须根据分组依据对 col2 求和。但它属于一个链,如果链断裂则sum将被限制在序列中。
DECLARE @TabVar TABLE
(
ID INT IDENTITY(1,1), col1 varchar(20), Col2 INT
)
INSERT INTO @TabVar
VALUES ('a',2),('a',3),('b',4),('b',2),('a',6),('a',3),('b',3)
SELECT * FROM @TabVar
Expected output:
COL1 SUM(COL2)
A 5
B 6
A 9
B 3
我曾尝试使用排名函数来完成排名,但排名是使用 Order by 累积 Col1 的总数来完成的
您可以使用 ROW_NUMBER()
和 PARTITION BY
,然后使用 GROUP BY
来实现。
每当你的链断裂时,id - ROW_NUMBER()over(partition by col1 order by id)
将具有相同的 col1
值的不同值。然后,您可以将其与 col1
一起使用以对数据进行分组并执行 SUM
。像这样
示例数据
DECLARE @TabVar TABLE
(
ID INT IDENTITY(1,1), col1 varchar(20), Col2 INT
)
INSERT INTO @TabVar
VALUES ('a',2),('a',3),('b',4),('b',2),('a',6),('a',3),('b',3)
查询
SELECT Col1,SUM(Col2) sumcol
FROM
(
SELECT id - ROW_NUMBER()over(partition by col1 order by id) grpcol,Col1,Col2,id
FROM @TabVar
)T
GROUP BY grpcol,Col1
ORDER BY MAX(ID)
输出
Col1 sumcol
a 5
b 6
a 9
b 3
编辑
如果你的ID
在现场环境中不连续,你可以使用这个
SELECT Col1,SUM(Col2) sumcol
FROM
(
SELECT ROW_NUMBER()over(order by id) - ROW_NUMBER()over(partition by col1 order by id) grpcol, Col1,Col2,id
FROM @TabVar
)T
GROUP BY grpcol,Col1
ORDER BY MAX(ID)