一尘不染

多个累计金额

sql

希望标题足够明确。

我有一张看起来像这样的表:

classes id value
a       1  10
a       2  15
a       3  12
b       1  5
b       2  9
b       3  7
c       1  6
c       2  14
c       3  6

这就是我想要的:

classes id value cumsum
a       1  10    10
a       2  15    25
a       3  12    37
b       1  5     5
b       2  9     14
b       3  7     21
c       1  6     6
c       2  14    20
c       3  6     26

我已经看到了这种解决方案,并且已经成功地将其应用于没有多个类的情况:

id value cumsum
1  10    10
2  15    25
3  12    37

即使使用与我当前正在处理的数据集大小相等的数据集,它的速度也相当快。

然而,当我尝试完全相同的代码适用于我的工作,现在的数据集(它看起来像这样的问题,IE浏览器的多个类的第一个表格),不受子集划分它abc,在我看来,它的服用年龄(它已经运行了4个小时。数据集是40.000行)。

在此上下文中使用时,是否知道链接的答案中的代码有问题?我很难将头缠绕在三角形连接上,但是当行数增加时,连接大小可能会出现问题,从而使整个事情放慢了很多,这可能会使情况变得更糟。有多个“类别”可用于进行累加总和的事实。

有什么办法可以更快地完成此工作吗?我使用的是SQLR通过SQLDF包装。使用R代码(带有或不带有外部通用程序包)或SQL代码的解决方案都可以。

谢谢


阅读 97

收藏
2021-05-16

共1个答案

一尘不染

在SQL中,您可以使用ANSI标准sum() over ()功能进行累加总和:

select classes, id, value,
       sum(value) over (partition by classes order by id) as cumesum
from t;
2021-05-16