【问题标题】:In Oracle how do you perform a calculation depending on the previous calculated result在Oracle中,如何根据先前的计算结果执行计算
【发布时间】:2015-04-07 18:08:31
【问题描述】:

我想进行如下简单的计算

数据集

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。

【问题讨论】:

标签: sql oracle11g


【解决方案1】:

如果您想计算运行总和,使用分析函数很容易:

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(参见 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;

这应该会给你想要的结果

【讨论】:

  • 有关分析函数的文档,请参阅docs.oracle.com/cd/E11882_01/server.112/e41084/…
  • 在这种情况下,您将每个数字乘以 0.99 作为 nvl(exp (sum (ln (value_one)) over (order by sr)), 1) * 0.99
  • 那是因为整个序列以 0.99 开头(见问题)。没有它,第一个结果将是 1。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
相关资源
最近更新 更多