SQL:如何检索上一年的平均值?

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

我的数据集有问题

年份 销售
1 2021 100
2 2021 150
3 2021 200
1 2022 100
2 2022 140
3 2022 120
1 2023 100
2 2023 100
3 2023 100

我想添加一个新列,其中每行包含上一年的销售平均值以获得此值:

年份 销售 去年平均销售额
1 2021 100
2 2021 150
3 2021 200
1 2022 100 150
2 2022 140 150
3 2022 120 150
1 2023 100 120
2 2023 100 120
3 2023 100 120

我试过这个:

lag("销售额",1)OVER ( 按“月”分区 按“年”、“月”ASC 排序 )

但它不适用于每一行

你有解决办法吗?

谢谢

sql
2个回答
0
投票

我不知道Windows函数是否有一种棘手的方法可以将其绑定到去年的平均值。但你可以轻松地这样做(内联视图):

WITH AvgYear AS (
    SELECT YEAR, AVG(SALES) AVG_SALES  
    FROM XY
    GROUP BY YEAR)
SELECT 
    XY.MONTH, XY.YEAR, XY.SALES, 
    AvgYear.AVG_SALES AVG_SALES_LAST_YEAR,
    AVG(XY.SALES) OVER (PARTITION BY XY.YEAR) AVG_SALES_THIS_YEAR   
FROM XY LEFT JOIN AvgYear ON (XY.YEAR-1) = AvgYear.YEAR
ORDER BY XY.YEAR, XY.MONTH

今年的平均销售量对于windows功能来说是没有问题的,如你所见。


0
投票

am2 相同的方法仅用于更新语句,当您询问如何用平均值填充列时。

UPDATE data
SET year_mean = subquery.mean
FROM (
  SELECT year, avg(sales) as "mean" FROM data
  GROUP BY year
) as subquery
WHERE data.year = (subquery.year - 1);

确切的语法可能会有所不同,具体取决于您的 DBMS,但应该可以使其适应每个 DBMS。

以 postgres 为例: DB<>Fiddle.uk

© www.soinside.com 2019 - 2024. All rights reserved.