sql - SQL 中的累积

标签 sql sql-server cumulative-sum

我有一个查询,其结果如 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/

相关文章:

sql - 带间隙的运行总和

sql - 如何在 SQL Server 中正确分组结果

sql - 如何使用 JDBC 更新 Oracle Clob

c# - 获取包含表的数据库列表的有效方法

vba 代码在 f8 中运行,但不在 f5 中

php - 内联 SQL 和从 View 中选择之间的区别

sql - 如何将 SELECT 语句中的值赋给变量?

sql-server - 如何查询sql数据库中的列

sql - Spark中的累积总和

c++ - 简单程序 - 菜单只显示一次