即使缺少某些行,如何查找特定窗口期的平均销售额

问题描述 投票:0回答:1

我想在 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 的周,但如果有其他方法可以在不增加记录数量的情况下做到这一点。

sql mysql apache-spark apache-spark-sql
1个回答
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
© www.soinside.com 2019 - 2024. All rights reserved.