我正在尝试编写一个 MySQL 查询来计算数字列的标准差,而不使用 STD()。我的工作查询如下:
SELECT sqrt(power((amount-avg(amount)),2)/count(amount))
FROM Orders;
请将“金额”视为列名,将“订单”视为表名。我的问题是为什么在不使用求和函数的情况下会自动对 power((amount-avg(amount)),2) 的所有结果求和?
谢谢!
最佳答案
您正在使用 count() 函数,这是一个聚合函数,因此您将所有行分组。在您的查询中,amount 不是作为总和计算的,它仅使用某些行的值(不确定使用哪个行的值),因为 MySQL 允许将非分组列与分组列结合使用。
在这里阅读更多: https://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html
如果你只想自己实现它,你可以尝试这样查询:
SELECT @avg:=(SELECT avg(amount) FROM Orders), @cnt:=(SELECT count(*) FROM Orders),
SQRT(SUM(POWER(amount-@avg,2)/@cnt)) as std
FROM Orders
这将执行两个快速查询,获取平均值并只计算一次(因为每一行仍然相同),然后它将对您的公式求和并将其 sqrt 作为 std 返回。
关于MySQL为什么在使用聚合函数时自动求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30690377/