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

使用MySQL获取n行组的平均值,mysql,group-by,subquery,average,Mysql,Group By,Subquery,Average,我目前一直在尝试使用MySQL获取n行组的平均值 我有一个MySQL表(data_conso),由以下格式的列组成: id(int);日期(datetime);数据(整数) 我想(为了制作一个没有太多点的好图)将所有这些值按组(比如100)进行分割,然后得到每个组的平均值 通过一些搜索和修补,我成功地编写了以下查询: SET @i := 0; SELECT @i:=@i+1 as rownum, FLOOR(@i/100) AS `datagrp`, AVG(`tmptb

我目前一直在尝试使用MySQL获取n行组的平均值

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

我想(为了制作一个没有太多点的好图)将所有这些值按组(比如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来进行计算

我真的对这个问题感到沮丧,任何形式的帮助都会非常感激。
请原谅我的英语,提前谢谢你的回答

尝试将分组依据
datagrp
更改为分组依据
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`

只是猜测而已。如果您尝试:

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`

这个医生听起来像是你的问题

在SELECT语句中,仅当 发送到客户端。这意味着在HAVING、GROUP BY或ORDER BY中 子句中指定了一个值的变量 表达式列表未按预期工作


类似的方法应该可以奏效,其想法是将列
datagrp
附加到原始表中,然后只需为每个
datagrp

选择平均值。首先,感谢您的快速回答。问题是,GROUP BY
datagrp
允许我将100行分组,这是我需要的,以便获得它们的平均值。但您也可以按时间段分组,即
选择AVG(日期),AVG(数据)FROM data_conso GROUP BY CEIL((日期)/3600)
以获得每小时的平均值。非常感谢,这对我很有效。看来madflow是对的,我的@i是个问题。我还将它初始化为-1,以便有100行的组(如果没有,它只生成99行的组)。我会在几天内使用你的按日期分组的想法,我会随时通知你!我认为你可能走对了路,看到tera的查询对我有用。谢谢
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`;