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 に答える