Oracle提供了求和(SUM),平均值(AVG)等聚合函數,但沒有提供連乘的聚合函數。sql
好比有一個表以下:oracle
ID | NUM |
1 | 4 |
2 | 2 |
3 | 2 |
若是要求NUM列的連乘數,即求: 4*2*2 ,目前Oracle中沒有提供相似函數,但能夠經過某種變換來求。函數
公式爲: MUL(num) = EXP(SUM(LN(num))).net
數學上推導以下:blog
設 x = 4 * 2 * 2ip
ln(x) = ln(4*2*2) => ln(4) + ln(2) + ln(2) => sum(ln(num)get
x = e(sum(ln(sum)數學
x = exp(sum(ln(sum))io
有兩個地方要注意:table
1. ln的參數不能是負數,求值時要轉換成正的。
2. 連乘的結果可能比較大,會超出範圍。
參考:
http://viralpatel.net/blogs/row-data-multiplication-in-oracle/
http://stackoverflow.com/questions/5416169/mutiplication-aggregate-operator-in-sql
完