MySQL为什么在使用聚合函数时会自动求和?

3

我正在尝试编写一条MySQL查询,用于计算数值列的标准差,而不使用STD()函数。我的工作查询如下:

SELECT sqrt(power((amount-avg(amount)),2)/count(amount))
FROM Orders;

请将“amount”视为列名,“Orders”视为表名。我的问题是,为什么会自动对所有结果进行power((amount-avg(amount)),2)的求和,而不使用sum函数?
谢谢!
2个回答

1
您正在使用 count() 函数,这是一种聚合函数,因此您获得了所有的GROUPed行。在您的查询中,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

这将执行两个快速查询,仅获取平均值和计数(因为这些对每一行仍然是相同的),然后它将总结您的公式并返回其平方根作为标准差。

不,情况并非每一行被单独视为一个组。相反,事实是所有行都被视为一个大组,并且数据通过这个大组进行聚合 - count()将给出所有行的计数。'amount'将给出一些随机金额,它并不会每次都给出第一行的金额,而是取决于您的数据。 - Tomas M
现在我理解了很多。每次运行这个查询时,它似乎都会返回计算第一行金额的所有结果。我猜这可能是MySQL的默认设置。在这种情况下,如何编写查询以计算标准差而不使用STD()函数?谢谢! - Shengjie Zhang
我可以帮你处理SQL语句,但我不知道标准差应该如何计算。您不想使用STD()的原因是什么? - Tomas M
我只想在这里尝试实现 STD 函数。 - Shengjie Zhang
是的,谢谢你的帮助。 - Shengjie Zhang
显示剩余8条评论

-1

你的amount列没有计算总和。它是你表格中某一行的值。


谢谢!所以这个查询没有计算变量金额的标准差吗?它只是计算第一条记录的金额公式。是这样吗? - Shengjie Zhang
不,它不是第一行的值!它可以是,但不一定是。 - Tomas M
在MySQL中,没有第一行或第二行。通常将行视为行,并且没有人能够确定哪一行是第一行。表的物理顺序可以与您插入行的顺序大不相同。您甚至可以通过ALTER TABLE tbl ORDER BY col随时重新排序行的物理顺序。 - Tomas M
它不会是随机行。它将是某一行的值,但它不会是随机的。它将取决于SQL如何获取数据,表的物理结构等因素。没有指定它将是哪个值。 - Tomas M

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接