Oracle提供了求和(SUM),平均值(AVG)等聚合函数,但没有提供连乘的聚合函数。
比如有一个表如下:
ID | NUM |
1 | 4 |
2 | 2 |
3 | 2 |
如果要求NUM列的连乘数,即求: 4*2*2 ,目前Oracle中没有提供类似函数,但可以通过某种变换来求。
公式为: MUL(num) = EXP(SUM(LN(num)))
数学上推导如下:
设 x = 4 * 2 * 2
ln(x) = ln(4*2*2) => ln(4) + ln(2) + ln(2) => sum(ln(num)
x = e(sum(ln(sum)
x = exp(sum(ln(sum))
有两个地方要注意:
1. ln的参数不能是负数,求值时要转换成正的。
2. 连乘的结果可能比较大,会超出范围。
参考:
http://viralpatel.net/blogs/row-data-multiplication-in-oracle/
http://stackoverflow.com/questions/5416169/mutiplication-aggregate-operator-in-sql
完