作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有下表:
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 很大)。由于性能原因,我没有考虑类似光标的解决方案。
有什么建议吗?
<小时/>更新:
我在谷歌上进一步搜索了这个问题,并在此页面上找到了“更新到局部变量”解决方案:
据我测试,这被证明是迄今为止最好的解决方案。
声明@runningTotal float = 0
更新tbl_procSET @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/
我是一名优秀的程序员,十分优秀!