我的数据集有问题
月 | 年份 | 销售 |
---|---|---|
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 排序 )
但它不适用于每一行
你有解决办法吗?
谢谢
我不知道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功能来说是没有问题的,如你所见。
与 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