oracle sql实现 累乘

本文介绍了三种在SQL中计算累乘积的方法,包括使用窗口函数SUMOVER进行对数相加模拟乘法、利用ORACLE10g的MODEL子句处理负数情况以及通过聚合函数实现非负数的累乘。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

[quote]
[color=red]方法一:[/color]
使用窗口函数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函数。[/quote]
[quote]
[color=red]方法二:[/color]
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
[/quote]
[quote]
[color=red]方法三:(不支持负数)[/color]
--测试数据
create table t(id int,qty int);
insert into t
select 1,2 from dual union all
select 2,4 from dual union all
select 3,6 from dual union all
select 4,5 from dual;
--执行查询
Select power(10, Sum(Log(10, qty))) From t
--查询结果
240
[/quote]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值