mysql 中空值平均_mysql:一行中的多个列的平均值,忽略空值

我有一个包含多个数字列的大型表格(称为站点) - 称为a至f。 (这些是来自不同组织的网站排名,如alexa,google,quantcast等等,每个组织都有不同的范围和格式;它们是从外部DB直接转储的。)mysql:一行中的多个列的平均值,忽略空值

对于许多记录,一个或多个这些列的值为空,因为外部数据库没有数据。它们都覆盖我的数据库的不同子集。

我希望列t是它们的加权平均值(每个a..f都有我分配的静态权重),忽略空值(可能出现在它们中的任何一个中),除非它们全为空。

我宁愿用简单的SQL计算来完成此操作,而不是在应用程序代码中执行此操作,或者使用一些巨大的丑陋嵌套if块来处理空值的每个置换。 (鉴于我有越来越多的列要平均,因为我添加了更多的外部数据源,这将成倍地变得更加丑陋,并且容易出错。)

我会使用AVG,但那只适用于group by,这是在一个记录中。数据在语义上可以为空,我不想用一些“平均”值代替空值。我只想计算那些数据在那里的列。

有没有很好的方法来做到这一点?

理想情况下,我想要的是类似于UPDATE sites SET t = AVG(a*@a_weight,b*@b_weight,...),其中任何空值都被忽略,并且不会发生分组。

编辑:我结束了有什么用,根据面包车的和添加在正确的加权平均值(假设a需要已经标准化,在这种情况下为float 0-1(1 =越好):

UPDATE sites

SET t = (@a_weight * IFNULL(a, 0) + ...)/(IF(a IS NULL, 0, @a_weight) + ...)

WHERE (IF(a IS NULL, 0, 1) + ...) > 0

2010-03-15

Sai

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值