我有一张这样的桌子
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”不存在
如何将记录(行)与聚合列的先前记录进行比较?
因为
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;
小提琴这里
我建议先按年汇总,然后计算滞后的销售额。
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;
您应该先计算聚合
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;
看演示这里.