SQL累进和

标签 sql sql-server tsql sql-server-2008

我有下表:

CREATE TABLE tbl_proc(
    [proc] float,
    subscriber bigint   
)

数据:

proc | subscriber
-----|-----------
0.7  | 123456   
0.5  | 1234567  
0.3  | 12345    
0.3  | 45678    
0.3  | 1234 
0.2  | 123455   
0.1  | 894562   

我想找到一个很好的方法来向表中添加一个新列来表示上述值的总和。

结果:

proc | subscriber | col3
-----|------------|------------
0.7  | 123456     | 0.7
0.5  | 1234567    | 1.2 -- 0.7 + proc
0.3  | 12345      | 1.5
...

我发现了以下方法:

Select a.[proc],SUM(b.[proc])
from tbl_proc a, tbl_proc b
where a.[proc] <= b.[proc] and (a.[proc] <> b.[proc] or a.subscriber >= b.subscriber)
group by a.[proc],a.subscriber
order by a.[proc] desc

在我的表中,数据按过程降序排序。订阅者列也是唯一的。

我发现这个方法有点太贵了(我的 table 很大)。 由于性能原因,我没有考虑类似光标的解决方案。

有什么建议吗?

<小时/>

更新:

我在谷歌上进一步搜索了这个问题,并在此页面上找到了“更新到局部变量”解决方案:

http://geekswithblogs.net/Rhames/archive/2008/10/28/calculating-running-totals-in-sql-server-2005---the-optimal.aspx

据我测试,这被证明是迄今为止最好的解决方案。

声明@runningTotal float = 0

更新tbl_proc SET @RunningTotal = new_col = @RunningTotal + [proc] 来自 tbl_proc

最佳答案

这通常称为计算运行总计。

有一种非常快速的方法可以完成您想做的事情,称为“quirky update”,但它依赖于未记录的行为。

除此之外,游标是处理大型集合的最快方法,因为这些集合的工作负载呈线性增长,而三角连接工作负载呈指数增长(直到下一个版本和 the improved OVER clause )。

参见this document作者:Itzik Ben Gan,了解有关该问题的更多信息。

关于SQL累进和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7321464/

相关文章:

sql - SQL Server 存储过程中的自定义标识符生成

php - 使用 LIKE 子句的 MySql 搜索不起作用

c# - EF 6 参数嗅探

sql-server - 为 sql server 中的一组行生成哈希

sql - 连接表上的 Where 子句

mysql - 将时间戳转换为正确的格式

java - 使用 SQL Server uniqueidentifier 在 Java 中生成顺序 GUID

sql - sql 2008中大表的高效分页

sql - 如何避免隐式类型转换

sql-server - SQL Server : Number of 8K Pages Used by a Table and/or Database