Mysql 每行数据的当前平均值

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 有

我有一个表输出,带有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


sqlfiddle

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

这避免了依赖子查询,依赖子查询取决于数据的大小,可能会产生更好的性能。

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,它也会失败——现在不会了。空值的大小可能是问题,也可能不是问题,取决于数据集。我没意见