按行的出现分组

时间:2015-05-15 06:48:41

标签: tsql group-by sql-server-2012 gaps-and-islands

有一个像下面这样的表,我必须根据group by获取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

我已尝试使用排名功能进行排名,但排名是使用排序累计Col1

完成的

1 个答案:

答案 0 :(得分:2)

您可以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)