【问题标题】:Sequential Group By in sql serversql server中的顺序分组
【发布时间】:2013-10-18 21:24:27
【问题描述】:

对于这个表:

+----+--------+-------+
| ID | Status | Value |
+----+--------+-------+
|  1 |      1 |     4 |
|  2 |      1 |     7 |
|  3 |      1 |     9 |
|  4 |      2 |     1 |
|  5 |      2 |     7 |
|  6 |      1 |     8 |
|  7 |      1 |     9 |
|  8 |      2 |     1 |
|  9 |      0 |     4 |
| 10 |      0 |     3 |
| 11 |      0 |     8 |
| 12 |      1 |     9 |
| 13 |      3 |     1 |
+----+--------+-------+

我需要对具有相同Status 的连续组求和才能产生此结果。

+--------+------------+
| Status | Sum(Value) |
+--------+------------+
|      1 |         20 |
|      2 |          8 |
|      1 |         17 |
|      2 |          1 |
|      0 |         15 |
|      1 |          9 |
|      3 |          1 |
+--------+------------+

如何在 SQL Server 中做到这一点?

注意:ID 列中的值是连续的。

【问题讨论】:

  • ID 值是否保证是连续的?如果不能保证它们是连续的,那么如果缺少ID=2 的行会发生什么情况? Ids 13 的行是否仍被视为在同一组中?另请删除图像并以文本形式提供示例数据。这更易于访问,并且使潜在的回答者更容易设置测试表,而无需自己输入。查看标记为 SQL Server 的其他问题以获取示例。
  • 是的,ID 值保证是连续的。

标签: sql sql-server select group-by gaps-and-islands


【解决方案1】:

根据我在您的问题中添加的标签,这是一个空白和孤岛问题。

表现最好的解决方案可能是

WITH T
     AS (SELECT *,
                ID - ROW_NUMBER() OVER (PARTITION BY [STATUS] ORDER BY [ID]) AS Grp
         FROM   YourTable)
SELECT [STATUS],
       SUM([VALUE]) AS [SUM(VALUE)]
FROM   T
GROUP  BY [STATUS],
          Grp
ORDER  BY MIN(ID)

如果ID 的值不能保证是连续的,那么你需要使用

ROW_NUMBER() OVER (ORDER BY [ID]) - 
       ROW_NUMBER() OVER (PARTITION BY [STATUS] ORDER BY [ID]) AS Grp

而是在 CTE 定义中。

SQL Fiddle

【讨论】:

猜你喜欢
  • 2013-09-13
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-10-08
  • 2016-12-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多