4

我一直在阅读有关在 mysql 查询中估计移动平均值的几篇文章,但是我的情况似乎稍微困难一些,因为该表不包含我想要计算平均值的列。我需要计算每个组的行数,并显示该组的移动平均值。

我在表中基本上只有一列相关,那就是 DATETIME 列。该表可以包含具有相同日期的多行。我想按 YEARWEEK 和 COUNT(*) 对每个 YEARWEEK 组的行数进行分组。这很容易,困难的部分是还要计算移动 4 周平均值

+-------------+
| DatoLagtTil |
+-------------+
| 2012-11-01  |
| 2012-10-25  |
| 2012-10-25  |
| 2012-10-11  |
| 2012-10-04  |
| ...         |
| ...         |
| ...         |
| ...         |
+-------------+

这是我要创建的输出表 - 4 周(YEARWEEK)移动平均线是困难的部分(注意:下面的示例不是基于上面的示例数据)

+------------+------------+-----------+
| YEARWEEK   | COUNT      | m_average |
+------------+------------+-----------+
| 201201     |     5      |     5     |
| 201202     |     10     |     7.5   |  
| 201203     |     5      |     6.6   |
| 201204     |     15     |     8.8   | 
| 201205     |     10     |     10    |
| 201206     |     5      |     8.8   |
| 201207     |     5      |     8.8   |
+------------+------------+-----------+

我找到了几个很好的资源来解释如何计算移动平均线,但是我无法让它们在我的情况下工作。我希望你们能提供帮助。

谢谢

- -状态更新 - -

自从我发布这个问题以来,一直在尝试一些解决方案。我觉得我越来越近了,但仍然缺少一些重要的东西。

通过下面的查询,我没有收到任何错误,但是对于所有 YEARWEEK 组,我的 Count(k.DatoLagtTil) 和相同的 AVG(cnt) 都太高了...我确实相信这与 WHERE 子句有关正在使用

SELECT YEARWEEK(k.DatoLagtTil), COUNT(k.DatoLagtTil), AVG(cnt)
  FROM  Kunder_db k, (SELECT COUNT(*) AS cnt
          FROM Kunder_db
         WHERE YEARWEEK(DatoLagtTil) BETWEEN YEARWEEK(DatoLagtTil) - 3 AND YEARWEEK(DatoLagtTil)
        GROUP BY YEARWEEK(DatoLagtTil)) x
GROUP BY YEARWEEK(k.DatoLagtTil)
4

2 回答 2

2

只需使用合适的范围标准再次将计数查询与您的表连接:

SELECT   t.yearweek,
         t.count,
         COUNT(*) / 4 AS m_average

FROM     my_table JOIN (
  SELECT   YEARWEEK(DatoLagtTil) AS yearweek,
           COUNT(*) AS count
  FROM     my_table
  GROUP BY yearweek
) t ON t.yearweek BETWEEN YEARWEEK(DatoLagtTil)
                      AND YEARWEEK(DatoLagtTil + INTERVAL 3 week)

GROUP BY t.yearweek

sqlfiddle上查看。

于 2012-11-10T22:10:11.273 回答
0

在 mysql 8窗口函数框架中可用于获取平均值。

SELECT YEARWEEK(k.DatoLagtTil) as YRWK, count(*), AVG(count(*)) OVER (ORDER BY YEARWEEK(k.DatoLagtTil) ROWS 3 PRECEDING) as m_average
FROM Kunder_db
GROUP BY YRWK

这将计算当前行和前 3 行的平均值。

于 2021-12-10T22:34:13.880 回答