ORACLE生成累乘积

方法一:

使用窗口函数SUM OVER,用对数相加来模拟乘法操作。

SQL> select empno,ename,sal
  2  from emp
  3  where deptno=10;

     EMPNO ENAME             SAL
---------- ---------- ----------
      7782 CLARK            2450
      7839 KING             5000
      7934 MILLER           1300

下面是实现方法

SQL> select empno,ename,sal,
  2  exp(sum(ln(sal)) over(order by sal,empno)) as running_prod
  3  from emp
  4  where deptno=10;

     EMPNO ENAME             SAL RUNNING_PROD
---------- ---------- ---------- ------------
      7934 MILLER           1300         1300
      7782 CLARK            2450      3185000
      7839 KING             5000   1.5925E+10

注意,在SQL中,对小于等于0的值取对数是无效的。如果表中包含这样的值,一定要避免把这些无效的值传递给SQL的LN函数。

 

方法二:

ORACLE 10g引入了MODEL子句,在下面的例子中,每个SAL都是负数,这表明累乘积允许出现负值。

SQL> select empno,ename,sal,tmp as running_prod
  2  from
  3  (
  4  select empno,ename,-sal as sal
  5  from emp
  6  where deptno=10
  7  )
  8  model
  9  dimension by(row_number() over(order by sal desc) rn)
 10  measures(sal,0 tmp,empno,ename)
 11  rules
 12  (
 13  tmp[any]=case when sal[currentv()-1] is null then sal[currentv()]
 14     else tmp[currentv()-1]*sal[currentv()]
 15     end
 16  );

     EMPNO ENAME             SAL RUNNING_PROD
---------- ---------- ---------- ------------
      7934 MILLER          -1300        -1300
      7782 CLARK           -2450      3185000
      7839 KING            -5000   -1.593E+10

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值