You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 09:35:17