Oracle中如何根据之前的计算结果进行计算
In Oracle how do you perform a calculation depending on the previous calculated result
我想做一个简单的计算如下
数据集
SR value_one result
1 null 0.99
2 1 0.99*1 = 0.99
3 0.75 0.99*0.75 = 0.7425
4 0.75 0.7425*0.75 = 0.556875
5 1 0.556875*1 = 0.556875
6 1 0.556875*1 = 0.556875
7 1 0.556875*1 = 0.556875
8 1 0.556875*1 = 0.556875
9 1 0.556875*1 = 0.556875
10 1 0.556875*1 = 0.556875
对于 SR >= 2,结果取决于前一个结果,但始终以 0.99 开头。
在执行计算时循环。
数据库 Oracle。
如果您想计算 运行 总和,使用解析函数很容易做到:
with d as (
select 1 as sr, cast(null as number) as value_one from dual union all
select 2 as sr, 1 as value_one from dual union all
select 3 as sr, 0.75 as value_one from dual union all
select 4 as sr, 0.75 as value_one from dual union all
select 5 as sr, 1 as value_one from dual union all
select 6 as sr, 1 as value_one from dual union all
select 7 as sr, 1 as value_one from dual union all
select 8 as sr, 1 as value_one from dual union all
select 9 as sr, 1 as value_one from dual union all
select 10 as sr, 1 as value_one from dual
)
select d.*, sum(nvl(value_one, 0.99)) over (order by sr)
from d;
不幸的是,这里没有我们可以使用的 "PRODUCT" 聚合函数,所以我们不得不绕道使用 EXP 和 LN(参见 ):
with d as (
select 1 as sr, cast(null as number) as value_one from dual union all
select 2 as sr, 1 as value_one from dual union all
..
)
select d.*, nvl(exp (sum (ln (value_one)) over (order by sr)), 1) * 0.99
from d;
这应该会给你想要的结果
我想做一个简单的计算如下
数据集
SR value_one result
1 null 0.99
2 1 0.99*1 = 0.99
3 0.75 0.99*0.75 = 0.7425
4 0.75 0.7425*0.75 = 0.556875
5 1 0.556875*1 = 0.556875
6 1 0.556875*1 = 0.556875
7 1 0.556875*1 = 0.556875
8 1 0.556875*1 = 0.556875
9 1 0.556875*1 = 0.556875
10 1 0.556875*1 = 0.556875
对于 SR >= 2,结果取决于前一个结果,但始终以 0.99 开头。
在执行计算时循环。 数据库 Oracle。
如果您想计算 运行 总和,使用解析函数很容易做到:
with d as (
select 1 as sr, cast(null as number) as value_one from dual union all
select 2 as sr, 1 as value_one from dual union all
select 3 as sr, 0.75 as value_one from dual union all
select 4 as sr, 0.75 as value_one from dual union all
select 5 as sr, 1 as value_one from dual union all
select 6 as sr, 1 as value_one from dual union all
select 7 as sr, 1 as value_one from dual union all
select 8 as sr, 1 as value_one from dual union all
select 9 as sr, 1 as value_one from dual union all
select 10 as sr, 1 as value_one from dual
)
select d.*, sum(nvl(value_one, 0.99)) over (order by sr)
from d;
不幸的是,这里没有我们可以使用的 "PRODUCT" 聚合函数,所以我们不得不绕道使用 EXP 和 LN(参见 ):
with d as (
select 1 as sr, cast(null as number) as value_one from dual union all
select 2 as sr, 1 as value_one from dual union all
..
)
select d.*, nvl(exp (sum (ln (value_one)) over (order by sr)), 1) * 0.99
from d;
这应该会给你想要的结果