mysql - 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中做到吗?先感谢您!
解决方案
您可以将 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
推荐阅读
- sql - 获取上个月的记录
- amazon-athena - Athena 嵌套数组结构查询
- javascript - 如何在 typescript 中捕获数据库插入(运行时)错误并在 chai 中编写合适的测试用例?
- javascript - 整洁的 UX 技巧不起作用。我该如何解决?
- sylius - 定制夹具套件
- python - 在 jupyter notebook 中运行代码时出现 BrokenProcessPool
- python-3.x - 如何将 Python 3 中的 PDF 打印到 OSX 中的默认打印机?
- python - 如何创建一个函数来评估用户输入函数在某个 x 值处的导数
- python - 如何避免循环进口?
- scala - 如何在scala中将字符串值映射和重新映射到Int或double