我目前很难尝试使用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`
理论上哪种方法可行(或者至少我不知道为什么不会)但只返回一个值!非常奇怪的是,如果我移除tmptbl
。data
周围的AVG()函数,它将返回每个组,只是没有平均值。
我不明白为什么作为聚合函数的AVG()为了进行计算而不使用GROUP BY。
我对此问题感到非常沮丧,任何形式的帮助都会受到赞赏。 原谅我的英语,并提前感谢您的回答!
答案 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 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`
答案 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中赋值的变量 表达式列表无法按预期工作