我想在 Spark SQL 中查找商品过去 4 周的平均销售额。
项目 | 周数 | 销售 |
---|---|---|
1 | 202401 | 4 |
1 | 202402 | 6 |
1 | 202403 | 2 |
1 | 202404 | 6 |
2 | 202401 | 4 |
2 | 202402 | 1 |
2 | 202403 | 1 |
3 | 202401 | 8 |
我想要类似 -
的数据项目 | week_num | 销售 | 平均销售额_4_周 |
---|---|---|---|
1 | 202401 | 4 | 1 |
1 | 202402 | 6 | 2.5 |
1 | 202403 | 2 | 3 |
1 | 202404 | 6 | 4.5 |
2 | 202401 | 4 | 1 |
2 | 202407 | 1 | 0.25 |
2 | 202408 | 1 | 0.5 |
3 | 202401 | 8 | 2 |
我使用以下查询来查找平均值,如果某些特定项目的所有连续周数都出现在表中,但如果不存在连续周数(在上面的项目号 2 的数据示例中,有202401 和 202407 之间没有周,因此通过以下查询,窗口函数将使用 202401 周来计算 202408 周的平均值,但我不希望这样做,因为从技术上讲,在 202408 周,最后 4 周的平均值将从 202405 到 202408)。因此,如果在几周内没有销售额,则应将其用于计算平均值。
select *, avg(sales) over
(PARTITION BY item ORDER BY week_num DESC ROWS BETWEEN current row
and 3 following ) as Avg_sales_4_weeks
我可以分解数据并插入销售额为 0 的周,但如果有其他方法可以在不增加记录数量的情况下做到这一点。
您可以简单地使用相关子查询来获取 4 周的平均值。
select item, week_num, sales,
(select sum(sales) / 4 from tablename t2
where t2.week_num between t1.week_num - 3 and t1.week_num
and t2.item = t1.item) Avg_sales_4_weeks
from tablename t1