Mysql 每行数据的当前平均值
我有一个表输出,带有as DateOutput 1月1日至20日 1月2日至40日 1月3日至30日 1月4日至100日 1月5日至12日 1月6日至10日 1990年1月7日至9日 1980年1月8日至8日 1月9日至6日 12月31日至120日 我需要查询每个日期的平均值,其中平均值是从第一个日期到当前日期的值的累积平均值,如下所示- 日期输出平均值 2020年1月1日至1日 2-4030年1月2日 1月3日至30日 4-1月10047.5日 2002年1月5日至12日 6-1053.5 有人能帮忙吗Mysql 每行数据的当前平均值,mysql,average,Mysql,Average,我有一个表输出,带有as DateOutput 1月1日至20日 1月2日至40日 1月3日至30日 1月4日至100日 1月5日至12日 1月6日至10日 1990年1月7日至9日 1980年1月8日至8日 1月9日至6日 12月31日至120日 我需要查询每个日期的平均值,其中平均值是从第一个日期到当前日期的值的累积平均值,如下所示- 日期输出平均值 2020年1月1日至1日 2-4030年1月2日 1月3日至30日 4-1月10047.5日 2002年1月5日至12日 6-1053.5 有
SELECT `date`, `output`,
(SELECT avg(`output`) from Table1 where Table1.`date` <= b.`date`)
as `average` FROM Table1 b
sqlfiddle
sqlfiddleAxel的答案是有效的,或者,您可以在一个查询中使用变量来实现:
set @count := 0;
set @total := 0;
select case when ((@count := @count + 1) and ((@total := @total + output) or 1))
then @total / @count
end rolling_average,
`date`,
`output`
from data
order by `date` asc
这避免了依赖子查询,依赖子查询取决于数据的大小,可能会产生更好的性能。Axel的答案有效,或者,您可以通过变量在单个查询中完成:
set @count := 0;
set @total := 0;
select case when ((@count := @count + 1) and ((@total := @total + output) or 1))
then @total / @count
end rolling_average,
`date`,
`output`
from data
order by `date` asc
这避免了依赖子查询,依赖子查询取决于数据的大小,可能会产生更好的性能。Pala的想法是个好主意。除了缺少order by之外,如果累计和曾经为零或者如果输出曾经为空,它也会失败。这很容易解决:
select `date`, `output`,
if((@count := @count + 1) is not null,
if((@total := @total + coalesce(output, 0)) is not null,
@total/@count, 0
), 0
) as running_average
from data cross join
(select @count := 0, @total := 0) init
order by date;
帕拉的想法是个好主意。除了缺少order by之外,如果累计和曾经为零或者如果输出曾经为空,它也会失败。这很容易解决:
select `date`, `output`,
if((@count := @count + 1) is not null,
if((@total := @total + coalesce(output, 0)) is not null,
@total/@count, 0
), 0
) as running_average
from data cross join
(select @count := 0, @total := 0) init
order by date;
这是另一种方法,虽然Pala的方法更适合于
SELECT x.*
, AVG(y.output) avg
FROM output x
JOIN output y
ON y.date <= x.date
GROUP
BY x.date
ORDER
BY x.date;
在5.5/5.6版之后,order by子句显然是必要的,这里有另一种方法,尽管Pala的方法可以更好地扩展
SELECT x.*
, AVG(y.output) avg
FROM output x
JOIN output y
ON y.date <= x.date
GROUP
BY x.date
ORDER
BY x.date;
order by子句在5.5/5.6版之后显然是必要的到目前为止您有什么样的SQL语句?到目前为止您有什么样的SQL语句可能重复?没有order by子句可能重复,不应依赖此解决方案。正如其他地方指出的,如果第一个值为0,它也会失败,但现在不会。空值的大小可能是问题,也可能不是问题,取决于数据集。我同意这一点如果没有order by子句,这个解决方案就不应该被依赖。正如其他地方指出的那样——如果第一个值是0,它也会失败——现在不会了。空值的大小可能是问题,也可能不是问题,取决于数据集。我没意见