如何计算 MySQL 表中所有行的 MIN、MAX、AVG

Posted

技术标签:

【中文标题】如何计算 MySQL 表中所有行的 MIN、MAX、AVG【英文标题】:How to compute the MIN, MAX, AVG of all rows in MySQL table 【发布时间】:2019-03-04 20:43:39 【问题描述】:

我有一个包含测量数据的 mysql 表。例如:

# name, time
first, 0.0013
second, 0.0015
third, 0.0012
fourth, 0.0019

我想计算所有行的 MAX、MIN 和 AVG。所以上面例子的结果应该是:

MIN: 0.0012 
MAX: 0.0019 
AVG: 0.001475

我知道 MIN、MAX 和 AVG MYSQL 函数。但它们返回单个字段的结果。我需要类似于 COUNT 函数的汇总结果。

编辑:

我没有必要在一个查询中获得所有 3 个函数的结果。有 3 个不同的查询很好。主要问题是如何聚合所有行的 MAX,如我在示例中所示。

【问题讨论】:

你不能以任何好的方式为同一个查询在不同的行中声明同一列的不同函数结果。为此,您需要执行 3 个单独的查询,每个查询都带有 AVGMINMAX 函数。最好的方法是将结果存储在不同的列中,即SELECT AVG(time), MAX(time), MIN(time) from ... @Mohammad 该链接询问聚合列。就我而言,我想要聚合行,而不是列。 @Johan 没关系。但是如何获得例如表中所有行的 MAX? 我在看到您的问题之前更新了我的评论以包含一个示例,但是为了按时间顺序,我也会将其粘贴在这里:) SELECT AVG(time), MAX(time), MIN(time) from ... 【参考方案1】:

像这样:

  select ROW_NUMBER(), least(first, second, third, fourth) as min, 
   greatest(first, second, third, fourth) as max,
  (first+ second+ third+ fourth)/4 as avg
  from table t;

如果你需要所有行的平均值,你可以编写另一个查询来根据这个结果计算它。

【讨论】:

谢谢。但我的表包含数千条记录。这个first, second, third, fourth 只是我的小例子。但我无法在查询中枚举数千行。 例如,在计数中,我们使用COUNT(column_name)。这将为指定列中的所有行提供聚合结果。【参考方案2】:

如果我从我们的 cmets 中理解正确,我相信这就是您要查找的内容,并且应该在一个查询中完成。

SELECT 
    MIN(time) AS minimum, 
    MAX(time) AS maximum, 
    AVG(time) AS average
FROM t;

【讨论】:

这会起作用吗?据我所知,如果不按其他值分组,就不能将聚合值与其他任何值一起返回。我从来没有尝试过在一个查询中多次重复... 在 MIN 行中还有一个小括号错误 - 右括号应该在 AS 之前 只要是同一套都没关系。如果我们想在不同的分组上使用 min 和 max 是行不通的。或者,如果我们想要不计算到单行中的其他值,它也不起作用。编辑:修正错字,谢谢:) 在我的服务器上测试过,运行良好,select MIN(id), MAX(id), AVG(id) from Paper; | 1000 | 2078 | 1539.0000 |。这很容易验证:select SUM(id) / (COUNT(id)) from Paper; | 1539.0000 |。这应该是被接受的答案。 @Johan 感谢您澄清这一点。有时这些“教科书规则”不够精确;)【参考方案3】:

您不介意在不同的查询中使用它吗?然后,您可以轻松地聚​​合。

SELECT MIN(time) AS minimum FROM <tablename>

SELECT MAX(time) AS minimum FROM <tablename>

SELECT AVG(time) AS minimum FROM <tablename>

编辑:这也可以毫无问题地总结到一个查询中。

SELECT MIN(time) AS minimum, MAX(time) AS maximum, AVG(time) AS average FROM <tablename>

我不知道在没有分组的情况下使用聚合器时可能会返回多个列。很好的特例。感谢Johan 和HoldOffHunger 的澄清。

【讨论】:

它可以工作,但有一个小问题。 MINMAXAVG 返回的数字大于表中的数字。例如,这是表中的实际最大数量:0.00348675。不知何故,MAX 返回:0.0034867459908127785。知道如何获得准确的结果吗? @user9371654 这是因为浮点数不精确。如果您想要精确的分数,请使用 DECIMAL @MatthiasBö:如果您借用其他答案,能否引用您的资料?

以上是关于如何计算 MySQL 表中所有行的 MIN、MAX、AVG的主要内容,如果未能解决你的问题,请参考以下文章

在 MySQL 中选择 MIN 值后选择 MIN (MAX)

聚合函数&count&sum&avg&max&min

如何获取 SQL 中具有 MAX 和 MIN 值的行的 ID

mysql中min和max查询优化

MySQL Min(), MAX() 使用另一个表中的 ID

如何在不使用索引检查 mysql 表中的 100000 条记录等所有行的情况下获得一行? [关闭]