0

我有下表:

+----+-------+
| id | value |
+----+-------+
|  1 |    10 |
|  2 |    11 |
|  3 |    12 |
+----+-------+

我想即时计算一列来计算value所有先前行的总和,以得出如下结果:

+----+-------+--------+
| id | value | offset |
+----+-------+--------+
|  1 |    10 |      0 |
|  2 |    11 |     10 |
|  3 |    12 |     21 |
+----+-------+--------+

什么是有效的方法来做到这一点?

4

2 回答 2

2

归功于 Egor Skriptunoff

select 
  id,
  value,
  nvl(
    sum(value) over (
      order by id rows between unbounded preceding and 1 preceding
    ), 0) as offset
from table

分析函数的伟大之处sum在于它是渐进式的,因为在每次迭代中,引擎都会记住为前一行计算的值,并且只将value前一行添加到总数中。换句话说,对于offset要计算的每个,它都将前一行offset与相加value。这是非常有效的,并且可以很好地扩展。

于 2013-03-14T06:31:23.563 回答
0

如果您的id值将按顺序排列,1,2,3 etc..那么

select a.*,(select sum(decode(a.id,1,0,b.value)) off_set from table b where b.id<=a.id-1)
from table a;

如果您id's不在序列中,请尝试以下代码

select a.*,(select sum(decode(a.rn,1,0,b.value)) off_set from (select table.*,rownum rn from table) b 
           where b.rn<=a.rn-1)
from (select table.*,rownum rn from table) a;
于 2013-03-14T06:57:10.797 回答