|
|
这是一个简单的加减来解决的
当然如果你需要begin为当前行之前的N行处的值的话,需要使用分析函数本身来解决
我这里只是简单的这么处理了
SQL> select * from test;
A B C D
---------- ---------- ---------- --------------------
1 2 3 4
6 7 8 9
3 1 2 1
SQL> select tt2.tta, tt2.ttb, tt2.ttc, sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) youwant
2 from
3 (
4 select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
5 from
6 (select ((select min(a) from test) + rownum - 1) aa from all_objects
7 where rownum <= (select max(a) - min(a) +1 from test)) t1,
8 test t2
9 where t1.aa = t2.a(+)
10 ) tt2;
TTA TTB TTC YOUWANT
---------- ---------- ---------- ----------
1 2 3 -1
2 0 0 -1
3 1 2 -2
4 0 0 -2
5 0 0 -2
6 7 8 -3
已选择6行。
SQL> select tt2.tta, tt2.ttb, tt2.ttc,10 + sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) youwant
2 from
3 (
4 select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
5 from
6 (select ((select min(a) from test) + rownum - 1) aa from all_objects
7 where rownum <= (select max(a) - min(a) +1 from test)) t1,
8 test t2
9 where t1.aa = t2.a(+)
10 ) tt2;
TTA TTB TTC YOUWANT
---------- ---------- ---------- ----------
1 2 3 9
2 0 0 9
3 1 2 8
4 0 0 8
5 0 0 8
6 7 8 7
已选择6行。
SQL> select tt2.tta, tt2.ttb, tt2.ttc,
2 10 + sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) + tt2.ttc - tt2.ttb begin,
3 10 + sum(tt2.ttb - tt2.ttc) over(order by tt2.tta) youwant
4 from
5 (
6 select t1.aa tta,decode(t2.a,null,0,t2.b) ttb,decode(t2.a,null,0,t2.c) ttc
7 from
8 (select ((select min(a) from test) + rownum - 1) aa from all_objects
9 where rownum <= (select max(a) - min(a) +1 from test)) t1,
10 test t2
11 where t1.aa = t2.a(+)
12 ) tt2;
TTA TTB TTC BEGIN YOUWANT
---------- ---------- ---------- ---------- ----------
1 2 3 10 9
2 0 0 9 9
3 1 2 9 8
4 0 0 8 8
5 0 0 8 8
6 7 8 8 7
已选择6行。
SQL> |
|