全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
17341 2
2012-11-15
首先声明,此方法,是在其他地方看到,不是本人原创,觉得很有意思,分享一下。
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;


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2012-11-15 20:58:05
好主意 感谢分享
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2012-11-15 22:14:17
数据分析师3K 发表于 2012-11-15 20:58
好主意 感谢分享
感谢支持!
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群