gpt4 book ai didi

sql - 在每个新的连续簇上重置为 0 的运行总和

转载 作者:行者123 更新时间:2023-12-04 20:56:43 25 4
gpt4 key购买 nike

我尝试过采用多种运行求和方法,但均以失败告终(请记住,我必须使用 SQL Server 2008,因此它比 2012 中的要复杂一些)。

目标是获得按日期排序的金额总和。任何时候类别字段在该列表中更改值,总和应该重新开始。

表结构:

[Date], [Category], [Amount]

例子:

[Date], [Category], [Amount], [RunSumReset]  
-------------------------------------------
1-Jan, catA, 10, 10
2-Jan, catA, 5, 15
3-Jan, catA, 15, 30
15-Jan, catB, 3, 3
1-Feb, catB, 6, 9
11-Feb, catA, 10, 10
12-Feb, catC, 2, 2
1-Apr, catA, 5, 5

非常感谢任何巧妙的提示或技巧

最佳答案

使用 2008 版会使事情变得有点棘手,因为带有 ORDER BY 子句的 SUM 的窗口版本不可用。

一种方法是:

WITH CTE AS (
SELECT [Date], Category, Amount,
ROW_NUMBER() OVER (ORDER BY [Date]) -
ROW_NUMBER() OVER (PARTITION BY Category
ORDER BY [Date]) AS grp
FROM mytable
)
SELECT [Date], Category, Amount, Amount + COALESCE(t.s, 0) AS RunSumReset
FROM CTE AS c1
OUTER APPLY (
SELECT SUM(c2.Amount)
FROM CTE AS c2
WHERE c2.[Date] < c1.[Date] AND
c1.Category = c2.Category AND
c1.grp = c2.grp) AS t(s)
ORDER BY [Date]

CTE 用于计算字段grp,该字段标识具有相同类别 的连续记录的孤岛。一旦 Category 改变,grp 值也会改变。使用此 CTE,我们可以按照在 SQL Server 2012 之前的版本中通常执行的方式计算运行总计,即使用 OUTER APPLY

关于sql - 在每个新的连续簇上重置为 0 的运行总和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41718922/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com