sql中的相乘聚合函数
sql中提供的聚合函数,通常包括sum,count,avg,max,min,但不包括乘法; 比如有这样一个数据集: id x 1 1 1 2 1 3 2 4 2 5 2 6 ;
想实现成如下形式 id prob_x
1 6 2 120
即让第一组中1*2*3=6 第二组中4*5*6=120
用data步中first+retain可以实现,但data需要先排序;
而sql的聚合函数中也没有相乘这一函数,于是有些牛人想到通过数学转化,将乘法转为加法,而sql中可以 用sum实现加法聚合。
说来也简单,主要想法就是A*B=exp(lnA*B)=exp(lnA+lnB);
select id,exp(sum(log(x))) as prob_x from data_set group by id; ============================================= 但我觉得也需要补充一点东西:
首先有0的情况下,log函数的定义域为{x>0},有0出现的时候,改组最后结果肯定为0;
其次是有负数的情况,需要对绝对值进行计算,计算每组负数的个数,如果负数是偶数个,那么结果为正,
如果为奇数个,则需要在结果上添上负号。 最后可以写成这样
select id,(case when sum(case when x=0 then 1 else 0 end) >0 then 0 when mod(sum(case when x<0 then 1 else 0 end),2)=0 then exp(sum(log(x)))
else -1*exp(sum(log(abs(x)))) end) as prod_x from data_set group by id;