Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 计算加权标准差_Mysql_Math_Standard Deviation - Fatal编程技术网

Mysql 计算加权标准差

Mysql 计算加权标准差,mysql,math,standard-deviation,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

我正在尝试使用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
函数已经处理了一个求和,它迭代了所有的值;当将其与当前值进行比较并再次求和时,我误用了group函数。然而,这只是直觉,我远不是MySQL专家


这可以通过其他方式实现吗?我真的不喜欢做“子查询”或任何花哨的事情,因为这将是一个巨大的(~500行)单个查询的一部分,它已经足够复杂了。我没有计算时间的问题,所以我不在乎重复计算。

有许多不同的方法来计算标准偏差,该公式直接使用定义。从维基百科页面开始,看看“快速计算方法”。这一部分是关于“运行”(在线)计算的。我需要一个离线计算-冻结的数据集,而不是“重复更新”。我可能会先简化您庞大的(~500行)单个查询!现在这不是一个选择。然而,我的问题是独立的:我很有兴趣了解如何使用简单的方法执行简单的计算。子查询是一种简单的方法,但您已经排除了它,因为这是一个500行的查询-因此,不,问题不是独立的。