我有一张这样的表
Table1(A,B)
A B
3 0
4 3
2 2
0 1
3 5
4 6
. .
. .
. .
. .
它有大约300万行。我想计算一下:
A_SUM = 3 *(3 + 2 + 1 + 5 + 6 + .......)+ 4 *(2 + 1 + 5 + 6 + ........)+ 2 * (1 + 5 + 6 + ...)+ 0 *(5 + 6 + ...) + 3 *(6 + ...)+ ........
B_SUM = 0 *(4 + 2 + 0 + 3 + 4 + .......)+ 3 *(2 + 0 + 3 + 4 + ........)+ 2 * (0 + 3 + 4 + ...)+ 1 *(3 + 4 + ...) + 5 *(4 + ...)+ ............
如何计算这些数据?
答案 0 :(得分:4)
你可以用累积金额做你想做的事。以下语法是ANSI标准,应该可以使用(取决于数据库的版本):
select sum(a*(revcumb - b)) as a_sum, sum(b*(revcuma - a)) as b_sum
from (select t.*,
sum(b) over (order by id desc) as revcumb,
sum(a) over (order by id desc) as revcuma
from table t
) t;
请注意,这不是使用rows between
或range between
,而是从(反向)累积总和中减去当前行中的值。
另请注意,这假定存在id列或其他列以指定行的顺序。 SQL表本质上是无序的,因此当需要时,需要一个列来指定排序。
并且,如果您没有累积总和(即SQL Server< 2012),那么您可以使用相关子查询执行相同的操作。
编辑:
Sybase可能支持也可能不支持上述内容。这个数据库有很多不同的版本,作为标签几乎没有任何价值。我认为这适用于大多数版本:
select sum(a*revcumb) as a_sum, sum(b*revcuma) as b_sum
from (select t.*,
(select sum(b) from table t2 where t2.id > t.id) as revcumb,
(select sum(a) from table t2 where t2.id > t.id) as revcuma
from table t
) t;