计算sql的季度增减百分比

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

我的桌子看起来像这样(简化):

日期 数字
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);
sql postgresql pieclouddb
1个回答
0
投票

您必须使用 LAGQuarter 函数来解决 ProgreSQL 中的问题。

QUARTER函数返回以下值之一:

  • 1 如果日期是一月、二月或三月。
  • 2 如果日期是四月、五月或六月。
  • 3 如果日期是七月、八月或九月。
  • 4 如果日期是十月、十一月或十二月。

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 上实现这项工作。

谢谢

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