我的桌子看起来像这样(简化):
日期 | 数字 |
---|---|
2021-01-31 | 359738 |
2021-02-28 | 378564 |
2021-03-31 | 349728 |
2021-04-30 | 368945 |
2021-05-31 | 321456 |
2021-06-30 | 387456 |
2021-07-31 | 310567 |
2021-08-31 | 342189 |
2021-09-30 | 395612 |
2021-10-31 | 278945 |
2021-11-30 | 365478 |
2021-12-31 | 347856 |
2022-01-31 | 319478 |
2022-02-28 | 382456 |
2022-03-31 | 324189 |
2022-04-30 | 395612 |
2022-05-31 | 367845 |
2022-06-30 | 310567 |
2022-07-31 | 382456 |
2022-08-31 | 347856 |
2022-09-30 | 324189 |
2022-10-31 | 395612 |
2022-11-30 | 319478 |
2022-12-31 | 365478 |
2023-01-31 | 302856 |
2023-02-28 | 334531 |
2023-03-31 | 364023 |
2023-04-30 | 334534 |
2023-05-31 | 313678 |
2023-06-30 | 313460 |
2023-07-31 | 357281 |
2023-08-31 | 314578 |
2023-09-30 | 307976 |
2023-10-31 | 304567 |
2023-11-30 | 311378 |
2023-12-31 | 366222 |
我可以简单地使用
LAG()
来计算本月与3个月前或1年前的数据相比的百分比变化。
但是现在,我想要得到这样的结果:计算每个季度的总和,然后得到百分比变化(下一年的Q1需要参考上一年的Q4来计算。)
例如:
年 | 季度 | 总数 | quarter_change_pct |
---|---|---|---|
2021 | 1 | 1088030 | 0.00% |
2021 | 2 | 1077857 | -0.93% |
2021 | 3 | 1048368 | -2.74% |
2021 | 4 | 992279 | -5.35% |
2022 | 1 | 1026123 | 3.41% |
2022 | 2 | 1074024 | 4.67% |
2022 | 3 | 1054501 | -1.82% |
2022 | 4 | 1080568 | 2.47% |
2023 | 1 | 1001410 | -7.33% |
2023 | 2 | 961672 | -3.97% |
2023 | 3 | 979835 | 1.89% |
2023 | 4 | 982167 | 0.24% |
我不知道如何解决这个问题,如果有人能帮忙的话,我将不胜感激。(顺便说一句,我使用的数据库支持大部分PostgreSQL语法,所以你也可以使用PostgreSQL进行演示,谢谢!)
样本数据:
create table tb1(
date date,
num int
);
insert into tb1 values
('2021-01-31', 359738),
('2021-02-28', 378564),
('2021-03-31', 349728),
('2021-04-30', 368945),
('2021-05-31', 321456),
('2021-06-30', 387456),
('2021-07-31', 310567),
('2021-08-31', 342189),
('2021-09-30', 395612),
('2021-10-31', 278945),
('2021-11-30', 365478),
('2021-12-31', 347856),
('2022-01-31', 319478),
('2022-02-28', 382456),
('2022-03-31', 324189),
('2022-04-30', 395612),
('2022-05-31', 367845),
('2022-06-30', 310567),
('2022-07-31', 382456),
('2022-08-31', 347856),
('2022-09-30', 324189),
('2022-10-31', 395612),
('2022-11-30', 319478),
('2022-12-31', 365478),
('2023-01-31', 302856),
('2023-02-28', 334531),
('2023-03-31', 364023),
('2023-04-30', 334534),
('2023-05-31', 313678),
('2023-06-30', 313460),
('2023-07-31', 357281),
('2023-08-31', 314578),
('2023-09-30', 307976),
('2023-10-31', 304567),
('2023-11-30', 311378),
('2023-12-31', 366222);
您必须使用 LAG 和 Quarter 函数来解决 ProgreSQL 中的问题。
QUARTER函数返回以下值之一:
LAG() 函数是一个功能强大的窗口函数,允许您访问同一结果集中前一行的数据。它对于将当前行中的值与前一行中的值进行比较特别有用。
最后,要获取结果集,SQL 脚本将是。
SELECT Year, QUARTER, total_num,
to_char((total_num-(LAG(total_num,1) OVER (ORDER BY Year, QUARTER))) * 100 /(LAG(total_num,1) OVER (ORDER BY Year,QUARTER)), 'S999D99%') as PCT
FROM
(SELECT EXTRACT('Year' FROM DATE) AS Year,
EXTRACT(QUARTER FROM DATE) AS QUARTER,
CAST (SUM(NUM) AS DECIMAL) AS total_num FROM tb1 GROUP BY Year, QUARTER
ORDER BY Year,QUARTER);
在 PostgreSQL 17 上实现这项工作。
谢谢