计算加权标准差

时间:2014-05-20 12:10:45

标签: mysql math standard-deviation

我正在尝试使用MySQL来计算加权标准差。将使用以下示例数据:值1到5​​,权重为1到5.这是构建数据的方法:

DROP TABLE IF EXISTS TempTable;

CREATE TABLE TempTable (value FLOAT, weight FLOAT);
INSERT INTO TempTable (`value`, `weight`) VALUES (1, 1);
INSERT INTO TempTable (`value`, `weight`) VALUES (2, 2);
INSERT INTO TempTable (`value`, `weight`) VALUES (3, 3);
INSERT INTO TempTable (`value`, `weight`) VALUES (4, 4);
INSERT INTO TempTable (`value`, `weight`) VALUES (5, 5);

计算加权平均值非常简单。它是怎么回事:

SELECT SUM(`value`*`weight`) / SUM(`weight`) AS wMean
       FROM TempTable;

(这确实给出了3.6666 ......)

然而,加权标准差的公式涉及加权平均值本身。如果我希望在单个select语句中执行此操作(我希望如此),我不能在查询中使用名称wMean,因此我必须“重新定义”wMean。这是我的最终结果:

SELECT SUM(`value`*`weight`) / SUM(`weight`) AS wMean,
       SUM(POW(`value`-(SUM(`value`*`weight`) / SUM(`weight`)), 2)
           *`weight`) / SUM(`weight`) AS wStd
       FROM TempTable;

然而,这不起作用。 “不起作用”我的意思是打印出以下错误:

ERROR 1111 (HY000) at line 14: Invalid use of group function

并且其原因在某种程度上是明确的:POW函数已经在一个求和上运行,它迭代了所有值;当它与当前值进行比较并再次求和时,我误用了组函数。然而,这只是直觉,我远不是MySQL专家。

这可以以其他方式完成吗?我真的不喜欢做“子查询”或任何花哨的东西,因为这将是一个巨大的(~500行)单一查询的一部分,这已经足够复杂了。我没有计算时间问题,所以我不关心进行冗余计算。

0 个答案:

没有答案