我正在尝试使用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行)单一查询的一部分,这已经足够复杂了。我没有计算时间问题,所以我不关心进行冗余计算。