使用MySQL获取n行组的平均值

时间:2011-07-11 14:31:14

标签: mysql group-by subquery average

我目前很难尝试使用MySQL获取n行组的平均值。

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

我想(为了制作一个没有太多点的漂亮图表)将所有这些值拆分为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`

理论上哪种方法可行(或者至少我不知道为什么不会)但只返回一个值!非常奇怪的是,如果我移除tmptbldata周围的AVG()函数,它将返回每个组,只是没有平均值。

我不明白为什么作为聚合函数的AVG()为了进行计算而不使用GROUP BY。

我对此问题感到非常沮丧,任何形式的帮助都会受到赞赏。 原谅我的英语,并提前感谢您的回答!

4 个答案:

答案 0 :(得分:3)

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的平均值。

答案 1 :(得分:0)

尝试将GROUP BY datagrp更改为GROUP BY tmptbldata

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`

答案 2 :(得分:0)

只是一个猜测。如果你尝试怎么办?

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`

答案 3 :(得分:0)

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

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

  

在SELECT语句中,每个select表达式仅在以下时进行计算   发送给客户。这意味着在HAVING,GROUP BY或ORDER BY中   子句,指的是在select中赋值的变量   表达式列表无法按预期工作