【问题标题】:MySQL moving average over past 14 daysMySQL 过去 14 天的移动平均线
【发布时间】:2021-04-19 19:59:06
【问题描述】:

在我的 MySQL 数据库中,我有以下名为 MYDATA 的视图(最初组合了 2 个数据表)。

表我的数据

user myDate items
17 2020-01-01 1.0
22 2020-01-01 6.0
17 2020-01-02 3.2
17 2020-01-04 4.0
17 2020-01-08 1.0
17 2020-01-09 6.2
22 2020-01-09 4.0
17 2020-01-10 5.3

如您所见,并非所有日期(myDate 列)都包含项目。对于选定的用户(即用户 17),我需要计算过去 14 天(包括“这一天”)所有日期(即包括 2020-01-03 不包括在MYDATA 表)。所以基本上我想获得以下内容:

user myDate result
17 2020-01-01 (avg last 14 days)
17 2020-01-02 (avg last 14 days)
17 2020-01-03 (avg last 14 days)
... ... ...
17 2020-12-30 (avg last 14 days)
17 2020-12-31 (avg last 14 days)

随意在 SQLFiddle 中使用它:http://sqlfiddle.com/#!9/02cc94/1

如果需要,我还有一个包含所有年份日期的“日历”表。

表日历

myDate
2020-01-01
2020-01-02
2020-01-03
2020-01-04
2020-01-05
2020-01-06

请问我该如何继续?谢谢你的帮助。这个问题我已经纠结了好几个月了。

【问题讨论】:

  • 重要!我只有 VERSION() 5.5.62-38.14 并且不确定是否可以升级它。 ??????
  • 随意在 SQLFiddle 中使用它为这个小提琴提供所需的输出。
  • 最大可能的利息期长度(以天为单位)或 CALENDAR 表中的行数是多少?
  • Calendar 包含从 2014 年到今天的所有日期(我需要计算各个年份的移动平均值)。另请注意,我不需要平均值本身,但实际上是项目的总和(过去 14 天)除以 14。(就像包含空值的平均值)。
  • 请严格为您的小提琴数据提供所需的输出(解释 2-3 行)。 PS。为什么在小提琴中使用items INTEGER 而分配十进制值?

标签: mysql moving-average mysql-5.6


【解决方案1】:

寻找

SELECT user, t1.myDate, SUM(t2.items) / 14 avg_items
FROM calendar t1
JOIN test t2 ON t2.myDate BETWEEN t1.myDate - INTERVAL 13 DAY and t1.myDate
GROUP BY t2.user, t1.myDate
ORDER BY 1,2

fiddle - MySQL8 特定的构造 (CTE) 仅用于 calendar 表生成。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-04-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 2022-10-14
    • 1970-01-01
    • 2017-09-01
    相关资源
    最近更新 更多