【问题标题】:Get the average of groups of n rows with MySQL使用 MySQL 获取 n 行组的平均值
【发布时间】:2011-07-11 14:31:13
【问题描述】:

我目前正试图使用​​ MySQL 获取 n 行组的平均值。

我有一个 MySQL 表 (data_conso),由以下格式的列组成: 标识(整数);日期(日期时间);数据(整数)

我想(为了制作一个没有太多点的漂亮图表)将所有这些值按组分割,比如说 100,然后得到每个组的平均值。

经过一番搜索和修改,我设法编写了以下查询:

SET @i := 0;
SELECT
    @i:=@i+1 as rownum,
    FLOOR(@i/100) AS `datagrp`,
    AVG(`tmptbl`.`data`)
FROM (
    SELECT `data`
    FROM data_conso ORDER BY `date` ASC
) as `tmptbl`
GROUP BY `datagrp`

理论上可行(或者至少我不知道为什么不可行)但只返回一个值!非常奇怪的是,如果我删除 tmptbl.data 周围的 AVG() 函数,它会按应有的方式返回每个组,只是没有平均值。

我不明白为什么 AVG() 是一个聚合函数,不使用 GROUP BY 来进行计算。

我对这个问题感到非常沮丧,任何形式的帮助都将不胜感激。 请原谅我的英语,并提前感谢您的回答!

【问题讨论】:

    标签: mysql group-by subquery average


    【解决方案1】:
    SET @i := 0;
    SELECT AVG(`date`), AVG(`data`)
    FROM
    (
        SELECT
            @i:=@i+1 as rownum,
            FLOOR(@i/100) AS `datagrp`,
            `date`,
            `data`
        FROM data_conso
        ORDER BY `date` ASC
    )
    GROUP BY `datagrp`;
    

    类似的方法应该可以,想法是将列 datagrp 附加到您的原始表中,然后只需选择每个 datagrp 的平均值。

    【讨论】:

    • 但您也可以按时间段分组,即SELECT AVG(date), AVG(data) FROM data_conso GROUP BY CEIL((date)/3600) 以获得每小时平均值。
    • 非常感谢,这对我有用。看来 madflow 是对的,而我的 @i 是个问题。我还将它初始化为 -1 以便拥有 100 行的组(如果我没有,它只会组成 99 组)。几天后我将使用您按日期分组的想法,我会及时通知您!
    【解决方案2】:

    尝试将 GROUP BY datagrp 更改为 GROUP BY tmptbl.data

    SET @i := 0;
    SELECT
        @i:=@i+1 as rownum,
        FLOOR(@i/100) AS `datagrp`,
        AVG(`tmptbl`.`data`)
    FROM (
        SELECT `data`
        FROM data_conso ORDER BY `date` ASC
    ) as `tmptbl`
    GROUP BY `tmptbl`.`data`
    

    【讨论】:

    • 首先,感谢您的快速回答。问题是 GROUP BY datagrp 允许我创建 100 行的组,我需要这些组才能使它们的平均值。
    【解决方案3】:

    只是猜测。如果你尝试怎么办:

    SET @i := 0;
    SELECT
        floor((@i := @i + 1)/100) AS `datagrp`,
        AVG(`tmptbl`.`data`)
    FROM (
        SELECT `data`
        FROM data_conso ORDER BY `date` ASC
    ) as `tmptbl`
    GROUP BY `datagrp`
    

    【讨论】:

      【解决方案4】:

      这个文档听起来像你的问题。

      http://dev.mysql.com/doc/refman/5.0/en/user-variables.html

      在 SELECT 语句中,每个选择表达式仅在 发送给客户。这意味着在 HAVING、GROUP BY 或 ORDER BY 子句,引用在 select 中赋值的变量 表达式列表没有按预期工作

      【讨论】:

      • 我认为您可能走在正确的道路上,看到 tera 的查询对我有用。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2015-02-04
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-13
      • 2013-11-28
      • 1970-01-01
      相关资源
      最近更新 更多