楼主: ziyenano
17413 2

[学习分享] sql中的相乘聚合函数 [推广有奖]

  • 0关注
  • 52粉丝

院士

7%

还不是VIP/贵宾

-

威望
2
论坛币
6137 个
通用积分
27.3565
学术水平
338 点
热心指数
326 点
信用等级
298 点
经验
57352 点
帖子
879
精华
1
在线时间
4132 小时
注册时间
2012-1-4
最后登录
2025-5-7

楼主
ziyenano 发表于 2012-11-15 11:41:18 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
首先声明,此方法,是在其他地方看到,不是本人原创,觉得很有意思,分享一下。
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;


二维码

扫码加我 拉你入群

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

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

关键词:sql Select RETAIN Elect Group sql 定义域 count

已有 2 人评分经验 论坛币 学术水平 热心指数 信用等级 收起 理由
Tigflanker + 5 + 3 + 3 + 3 就要聚合函数这个词,谢谢
数据分析师3K + 60 + 20 + 5 + 5 + 5 精彩帖子

总评分: 经验 + 60  论坛币 + 25  学术水平 + 8  热心指数 + 8  信用等级 + 8   查看全部评分

本帖被以下文库推荐

  • · sas|主题: 59, 订阅: 14

沙发
数据分析师3K 发表于 2012-11-15 20:58:05
好主意 感谢分享

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

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2026-1-3 20:51