我有一个查询,其结果如 ID、值。我想要的是按照 id 的顺序获取值,并计算另一列中的累积值。看看我的简化代码:
declare @TempTable Table
(
ID int,
Value int
)
insert into @TempTable values
(1, 10),
(2, -15),
(3, 12),
(4, 18),
(5, 5)
select t1.ID, t1.Value, SUM(t2.Value) AccValue from @TempTable t1
inner join @TempTable t2 on t1.ID >= t2.ID
group by t1.ID, t1.Value
order by t1.ID
Result:
ID Value AccValue
1 10 10
2 -15 -5
3 12 7
4 18 25
5 5 30
我想出的方法是在结果与其自身之间使用内部联接来达到此目的。但对于海量数据来说,这显然是一个低性能问题。
还有其他替代方法吗?
最佳答案
在2012版本中,您可以使用:
SELECT
id,
Value,
AccValue = SUM(Value) OVER (ORDER BY ID
ROWS BETWEEN UNBOUNDED PRECEDING
AND CURRENT ROW)
FROM
@TempTable ;
对于以前版本的 SQL-Server,请参阅我在类似问题中的回答:Recursive SQL- How can I get this table with a running total? ,使用光标解决方案。
更好的是,点击 @Aaron Bertrand 发表的精彩文章的链接,对计算运行总计的各种方法进行了彻底的测试:Best approaches for running totals – updated for SQL Server 2012
关于sql - SQL 中的累积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17527074/