sql server中的顺序分组方式

sql server中的顺序分组方式,sql,sql-server,select,group-by,gaps-and-islands,Sql,Sql Server,Select,Group By,Gaps And Islands,对于此表: +----+--------+-------+ | 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

对于此表:

+----+--------+-------+
| 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 | Sum(Value) |
+--------+------------+
|      1 |         20 |
|      2 |          8 |
|      1 |         17 |
|      2 |          1 |
|      0 |         15 |
|      1 |          9 |
|      3 |          1 |
+--------+------------+
如何在SQL Server中实现这一点


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

根据我添加到问题中的标记,这是一个间隙和孤岛问题

最好的解决方案可能是

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定义中


根据我添加到您问题中的标签,这是一个缺口和孤岛问题

最好的解决方案可能是

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定义中


是否保证
ID
值连续?如果不保证它们是连续的,那么如果缺少
ID=2
的行,会发生什么情况?ID为
1
3
的行是否仍被视为属于同一组?另外,请删除图像并以文本形式提供示例数据。这是更容易接近的,也使潜在的回答者更容易设置测试表,而不必自己输入。查看标记为SQL Server的其他问题的示例。是的,ID值保证是连续的。
ID
值是否保证是连续的?如果不保证它们是连续的,那么如果缺少
ID=2
的行,会发生什么情况?ID为
1
3
的行是否仍被视为属于同一组?另外,请删除图像并以文本形式提供示例数据。这是更容易接近的,也使潜在的回答者更容易设置测试表,而不必自己输入。请看标记为SQL Server的其他问题,以获取示例。是的,ID值保证是连续的。您能否详细说明为什么这样做?目前还不清楚,尤其是对没有经验的人来说。请参阅第5章的下载,您能详细说明一下为什么会这样吗?目前还不清楚,尤其是对没有经验的人来说。参见第5章下载,网址为