我有一个包含多个数字列的大型表格(称为站点) - 称为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