running average in mysql

后端 未结 4 1275
刺人心
刺人心 2021-01-25 06:15

I have the table like below

id   timestamp  speed
1    11:00:01   100
2    11:05:01   110
3    11:10:01   90
4    11:15 :01  80

I need to calcu

相关标签:
4条回答
  • 2021-01-25 07:07

    Does MySQL support windowing functions?

    select
      id, timestamp, speed,
      avg (speed) over (order by timestamp) as average
    from tbl
    

    If it doesn't this might work, although I doubt it's efficient:

    select
      min (t1.id) as id, t1.timestamp, min (t1.speed) as speed,
      avg (t2.speed)
    from
      tbl t1
      join tbl t2 on
        t2.id <= t1.id
    group by
      t1.timestamp
    order by
      t1.timestamp
    
    0 讨论(0)
  • 2021-01-25 07:09

    Your query is one way to do a running average:

    SELECT t.*,
           (select avg(speed) from tbl tt where tt.timestamp <= t.timestamp) as avg
    FROM tbl t;
    

    The alternative is to use variables:

    select t.*, (sum_speed / cnt) as running_avg_speed
    from (select t.*, (@rn := @rn + 1) as cnt, (@s := @s + speed) as sum_speed
          from tbl t cross join
               (select @rn := 0, @s := 0) params
          order by timestamp
         ) t;
    

    An index on tbl(timestamp) should further improve performance.

    0 讨论(0)
  • 2021-01-25 07:16

    What about a simple concurrent solution?

    SET @summ=0; SET @counter=0;SELECT *,(@counter := @counter +1) as cnt, (@summ := @summ+speed) as spd, (@summ/@counter) AS avg FROM tbl;
    
    0 讨论(0)
  • 2021-01-25 07:17

    Or slotting neatly between GL's two answers (performancewise anyway)...

    SELECT x.*, AVG(y.speed) avg
      FROM my_table x
      JOIN my_table y
        ON y.id <= x.id
     GROUP 
        BY x.id;
    
    0 讨论(0)
提交回复
热议问题