PostgreSQL完成按月累加

本文介绍在PostgreSQL中实现月度累计统计的方法,包括使用自关联子查询和窗口函数两种方式,适用于按省份和年份分组的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PostgreSQL完成按月累加

背景

统计某个指标,指标按照月进行累加,注意需要按省份和年份进行分组。
在这里插入图片描述

方法一、使用自关联

-- with 按月统计得到中间结果
WITH yms AS (SELECT regionid,SUM(getnum) AS getnum,SUM(dealnum) AS dealnum,to_char(qndate,'yyyy-MM') AS yearmonth
FROM t_queuenumber
GROUP BY regionid,to_char(qndate,'yyyy-MM')
ORDER BY regionid,yearmonth)

-- 查用子查询解决。
SELECT s1.regionid,s1.yearmonth, getnum,dealnum,
(SELECT SUM(getnum) FROM yms  s2 WHERE s2.regionid = s1.regionid AND s2.yearmonth <= s1.yearmonth  AND SUBSTRING(s1.yearmonth,0,5) = SUBSTRING(s2.yearmonth,0,5) ) AS getaccumulatednum,
(SELECT SUM(dealnum) FROM yms  s2 WHERE s2.regionid = s1.regionid AND s2.yearmonth <= s1.yearmonth  AND  SUBSTRING(s1.yearmonth,0,5) = SUBSTRING(s2.yearmonth,0,5) ) AS accumulatednum
FROM yms s1;

查询的结果如下:
在这里插入图片描述

方法二、使用窗口函数

更多关于窗口函数的用法,可以参考以前的文章。窗口函数十分适合这样的场景:

	WITH yms AS (SELECT regionid,SUM(getnum) AS getnum,SUM(dealnum) AS dealnum,to_char(qndate,'yyyy-MM') AS yearmonth
	FROM t_queuenumber
	GROUP BY regionid,to_char(qndate,'yyyy-MM')
	ORDER BY regionid,yearmonth)
	-- 窗口函数的使用
	SELECT regionid,yearmonth,
	SUM(getnum) OVER(PARTITION BY regionid,SUBSTRING(yearmonth,0,5) ORDER BY yearmonth) AS getaccumulatednum,
	SUM(dealnum) OVER(PARTITION BY regionid ,SUBSTRING(yearmonth,0,5) ORDER BY yearmonth)  AS dealaccumulatednum
	FROM yms; 

在这里插入图片描述


后记

可以使用子查询、可以使用窗口函数完成上面业务场景。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值