Calculating a Moving Average MySQL?

后端 未结 5 2055
半阙折子戏
半阙折子戏 2020-11-28 15:03

Good Day,

I am using the following code to calculate the 9 Day Moving average.

SELECT SUM(close)
FROM tbl
WHERE date <= \'2002-07-05\'
AND name_id         


        
5条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-11-28 15:44

    Starting from MySQL 8, you should use window functions for this. Using the window RANGE clause, you can create a logical window over an interval, which is very powerful. Something like this:

    SELECT
      date,
      close,
      AVG (close) OVER (ORDER BY date DESC RANGE INTERVAL 9 DAY PRECEDING)
    FROM tbl
    WHERE date <= DATE '2002-07-05'
    AND name_id = 2
    ORDER BY date DESC
    

    For example:

    WITH t (date, `close`) AS (
      SELECT DATE '2020-01-01', 50 UNION ALL
      SELECT DATE '2020-01-03', 54 UNION ALL
      SELECT DATE '2020-01-05', 51 UNION ALL
      SELECT DATE '2020-01-12', 49 UNION ALL
      SELECT DATE '2020-01-13', 59 UNION ALL
      SELECT DATE '2020-01-15', 30 UNION ALL
      SELECT DATE '2020-01-17', 35 UNION ALL
      SELECT DATE '2020-01-18', 39 UNION ALL
      SELECT DATE '2020-01-19', 47 UNION ALL
      SELECT DATE '2020-01-26', 50
    )
    SELECT
      date,
      `close`,
      COUNT(*) OVER w AS c,
      SUM(`close`) OVER w AS s,
      AVG(`close`) OVER w AS a
    FROM t
    WINDOW w AS (ORDER BY date DESC RANGE INTERVAL 9 DAY PRECEDING)
    ORDER BY date DESC
    

    Leading to:

    date      |close|c|s  |a      |
    ----------|-----|-|---|-------|
    2020-01-26|   50|1| 50|50.0000|
    2020-01-19|   47|2| 97|48.5000|
    2020-01-18|   39|3|136|45.3333|
    2020-01-17|   35|4|171|42.7500|
    2020-01-15|   30|4|151|37.7500|
    2020-01-13|   59|5|210|42.0000|
    2020-01-12|   49|6|259|43.1667|
    2020-01-05|   51|3|159|53.0000|
    2020-01-03|   54|3|154|51.3333|
    2020-01-01|   50|3|155|51.6667|
    

提交回复
热议问题