首页 文章

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

提问于
浏览
1

我目前正试图使用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`

这在理论上是可行的(或者至少我不是't know why it wouldn')但只返回一个值!非常奇怪的是,如果我删除 tmptbl 周围的AVG()函数 . data ,它返回每个组,只是没有平均值 .

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

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

4 回答

  • 0
    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 的平均值 .

  • 0

    尝试将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`
    
  • 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

    这个文件听起来像你的问题 .

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

    在SELECT语句中,仅在发送到客户端时评估每个选择表达式 . 这意味着在HAVING,GROUP BY或ORDER BY子句中,引用在select表达式列表中赋值的变量不能按预期工作

相关问题