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章下载,网址为