首页 > 解决方案 > MYSQL 中没有日期但按另一列分组的移动平均值

问题描述

我在 MYSQL(版本 5.7.33)中有一个表,如下所示:

日期 销售代表 销售
2021-04-01 杰克 10
2021-04-02 杰克 8
2021-03-01 丽莎 10
2021-03-02 丽莎 14
2021-03-03 丽莎 21
2021-03-04 丽莎 7
2021-03-08 丽莎 10
2021-03-09 丽莎 20
2021-03-10 丽莎 15

我想要销售列的移动平均值,但不希望它基于日期,因为日期有差距,而是我希望它基于行号并按 SalesRep 分组。所以是这样的:

日期 销售代表 销售 移动平均
2021-04-01 杰克 10 10
2021-04-02 杰克 8 9
2021-03-01 丽莎 10 10
2021-03-02 丽莎 14 12
2021-03-03 丽莎 21 15
2021-03-04 丽莎 7 13
2021-03-08 丽莎 10 12.4
2021-03-09 丽莎 20 13.6
2021-03-10 丽莎 15 13.8

因此,移动平均线是针对特定销售代表从开始到结束的所有日期,然后为另一个销售代表重新开始,依此类推。这可以在MYSQL中做到吗?先感谢您!

标签: mysqlmoving-average

解决方案


您可以将 avg 用作带有 frame 子句的窗口函数:

SELECT dt, salesrep, sale,
     AVG(sale) OVER (PARTITION BY salesrep ORDER BY dt
                    ROWS UNBOUNDED PRECEDING)
       AS moveavg

如果没有窗口函数,您只需连接每个 salesrep 的所有先前行:

select a.dt, a.salesrep, a.sale, avg(b.sale) as moveavg
from mysterytablename a
join mysterytablename b on b.salesrep=a.salesrep and b.dt <= a.dt
group by a.salesrep, a.dt

推荐阅读