如何计算SQL中两行之间的差异【PostgreSQL】-聚合列

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

我有一张这样的桌子

CREATE TABLE fake_sales
(
    group_id INT NOT NULL,
    year SMALLINT CHECK(year > 0),
    amount DECIMAL(10, 2) NOT NULL,
    PRIMARY KEY(year, group_id)
);

我想使用

LAG
窗口函数比较当年的销售额和去年的销售额。

像这样:

SELECT
    year,
    SUM(amount) AS annual_sale,
    LAG(annual_sale, 1) OVER (PARTITION BY year ORDER BY year) change_amount
FROM fake_sales
GROUP BY year;

但是我得不到想要的结果,我得到了这个错误

错误:列“annual_sale”不存在

如何将记录(行)与聚合列的先前记录进行比较?

sql postgresql aggregate-functions lag
3个回答
0
投票

因为

annual_sale
列确实不存在:lead中不允许使用别名。您应该使用
SUM(amount)
(或使用子查询)。

你也不需要划分你的滞后。

SELECT
    year,
    SUM(amount) AS annual_sale,
    LAG(SUM(amount)) OVER (
        ORDER BY year
    ) - SUM(amount) change_amount
FROM fake_sales
GROUP BY year;

小提琴这里


0
投票

我建议先按年汇总,然后计算滞后的销售额。

SELECT
    year,
    SUM(amount) AS annual_sales,
    LAG(SUM(amount)) OVER (ORDER BY year) AS prev_year_sales
FROM fake_sales
GROUP BY year
ORDER BY year;

0
投票

您应该先计算聚合

SUM
列,然后使用
LAG
计算差异。

SELECT 
    year,
    annual_sale,
    (annual_sale - LAG(annual_sale) OVER (ORDER BY year)) AS change_amount
FROM  
    (SELECT
        year,
        SUM(amount) AS annual_sale
    FROM fake_sales
    GROUP BY year) data;

看演示这里.

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