2015-04-01 66 views
1

我想执行一个简单的计算如下在Oracle中,你如何执行取决于先前计算的结果计算

数据集

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。

+1

可能重复(产品)在CONNECT-BY查询](http://stackoverflow.com/questions/27955093/not-getting-full-series-multiplication-product-in-connect-by-query) – Noel 2015-04-01 07:48:59

+0

不是重复的,函数在链接上累积相乘结果 – szakwani 2015-04-01 08:45:04

回答

2

如果你想要计算运行总和,它会很容易使用分析函数来执行:

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; 

不幸的是,没有“产品”聚合功能,我们可以在这里使用,所以我们要绕道使用EXP和LN(见https://stackoverflow.com/a/3912248/1230592):

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; 

这应该给你所期望的结果[未得到充分系列多

+0

有关分析函数的文档,请参阅http://docs.oracle.com/cd/E11882_01/server.112/e41084/functions004.htm#SQLRF06174 – guthy 2015-04-01 09:51:23

+0

在这种情况下,您将每个数字由nvl(exp(sum(ln(value_one))over(by sr order))的0.99,1)* 0.99 – szakwani 2015-04-01 10:55:48

+1

这是因为整个序列从0.99开始(见问题)。没有它,第一个结果将是1. – guthy 2015-04-01 11:07:47