问题描述
我在 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 |
我想要 Sale 列的移动平均值,但不希望它基于日期,因为日期有差距,而是我想要它基于行号并按 SalesRep 分组。所以是这样的:
日期 | 销售代表 | 销售 | MoveAvg |
---|---|---|---|
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 中做到吗?提前致谢!
解决方法
您可以将 avg 用作带有框架子句的窗口函数:
SELECT dt,salesrep,sale,AVG(sale) OVER (PARTITION BY salesrep ORDER BY dt
ROWS UNBOUNDED PRECEDING)
AS moveavg
如果没有窗口函数,您只需连接每个销售代表的所有前一行:
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