如何在SQL中为每行添加上一年度销售平均值列?
解决方案
你的需求是获取当前年份上一年的整体销售平均值,而非按月份取上一年同月份的销售额,因此原LAG()按Month分区的写法无法满足要求。以下两种方法可以实现目标:
方法1:子查询+关联查询
先计算每一年的销售平均值,再将结果关联回原表,匹配当前年份对应的上一年平均值:
SELECT t.Month, t.Year, t.Sales, prev_year_avg.Avg_Sales AS "Avg Sales Previous year" FROM your_table t LEFT JOIN ( SELECT Year, AVG(Sales) AS Avg_Sales FROM your_table GROUP BY Year ) prev_year_avg ON t.Year = prev_year_avg.Year + 1;
方法2:窗口函数(适用于PostgreSQL、SQL Server、BigQuery等支持窗口函数的SQL方言)
先通过窗口函数计算每年的整体平均值,再用LAG()获取上一年的该值,无需按Month分区:
SELECT Month, Year, Sales, LAG(yearly_avg) OVER (ORDER BY Year) AS "Avg Sales Previous year" FROM ( SELECT Month, Year, Sales, AVG(Sales) OVER (PARTITION BY Year) AS yearly_avg FROM your_table ) sub;
关键说明:
- 方法1兼容性更广,适用于所有支持关联查询的数据库;
- 方法2更简洁,先为每一行标记其所在年份的平均销售额,再通过
LAG()按年份顺序获取上一年的平均值,确保同一年的所有行得到相同的结果。
你原语句的问题在于按Month分区,导致只能拿到同月份上一年的单条销售额,而非上一年的整体平均,因此不符合需求。
内容的提问来源于stack exchange,提问作者nbs335
相关产品推荐
相关产品推荐

