【问题标题】:MySQL 5 min Moving Average (grouping rows by date ranges)MySQL 5 分钟移动平均线(按日期范围分组行)
【发布时间】:2018-02-11 16:43:02
【问题描述】:

我正在尝试从以下格式的数据中获取 5 分钟价格的 9 长度移动平均值:

ID、价格、时间线

1   15.36573000 2017-08-31 22:00:00
1   15.29229000 2017-08-31 21:55:00
1   15.23297000 2017-08-31 21:50:00
1   15.23469000 2017-08-31 21:45:00
1   15.23234000 2017-08-31 21:40:00
1   15.25399000 2017-08-31 21:35:00
1   15.26228000 2017-08-31 21:30:00
1   15.21136000 2017-08-31 21:25:00
1   15.29847000 2017-08-31 21:20:00
1   15.32074000 2017-08-31 21:15:00
1   15.32239000 2017-08-31 21:10:00
1   15.27938000 2017-08-31 21:05:00
1   15.25282000 2017-08-31 21:00:00

因此 9 个时间段(45 分钟)的平均值为:

8/31/2017 21:45 through 8/31/2017 21:05 = 15.26840444
8/31/2017 21:40 through 8/31/2017 21:00 = 15.27041889
8/31/2017 21:35 through 8/31/2017 20:55 = 15.27291889

我每天看到一些移动平均线,但无法确定如何按最后 9 个时间戳进行分组

【问题讨论】:

    标签: mysql moving-average


    【解决方案1】:

    在 MySQL 中处理此问题的一种方法是通过相关子查询。请注意,在下面的查询中,我不计算先前数据点的数量,而是依赖于时间差(40 分钟)。这似乎更有意义,因为您的数据可能并不总是具有相同数量的点。

    SELECT
        CONCAT(CAST(t1.timeline - INTERVAL 40 MINUTE AS CHAR(50)), ' through ',
               CAST(t1.timeline AS CHAR(50))) AS window,
        (SELECT AVG(t2.price) FROM yourTable t2
         WHERE t2.timeline
             BETWEEN t1.timeline - INTERVAL 40 MINUTE AND t1.timeline) AS avg_price
    FROM yourTable t1
    WHERE
        t1.timeline >= (SELECT MIN(timeline) + INTERVAL 40 MINUTE FROM yourTable)
    ORDER BY t1.timeline
    

    演示在这里:

    Rextester

    【讨论】:

    • 效果很好。在旁注中,我意识到由于某种原因我不能对视图执行此操作(当我将数据从视图复制到表中时它可以工作......但是针对视图运行的相同查询会变得疯狂) ......我已经为此工作了好几天,所以不会再浪费时间试图找出原因。谢谢你
    • Tim 我明白了为什么我的视图不起作用——因为我有多个 ID——如何在该子查询中按不同的 ID 分组?
    • 我看不到你的其他/实际数据,所以恐怕我的回答是我现在能做的最好的。您可以用更多信息更新您的问题,但如果这会使我的回答完全无效,那么您真的应该问另一个问题。
    • 感谢蒂姆,您的回答对您有所帮助-如果您能够将其写下来...大声笑,我希望有一天能到达那里:D
    • Derrick - 你现在到了吗。
    猜你喜欢
    • 2010-10-31
    • 2019-02-14
    • 1970-01-01
    • 2019-02-19
    • 2013-08-14
    • 1970-01-01
    • 2013-11-04
    • 2021-11-16
    相关资源
    最近更新 更多