PostgreSQL统计YYYYMM格式月份数据出现次数(禁止创建临时表)
提问内容
我有如下所示的数据集:
数据集为YYYYMM格式的年月值,我需要统计每个月份的出现次数,例如202001共出现3次,那么输出对应为1月 3(有对应期望输出结果示例)。
我目前不知道如何实现该期望输出,还请大家提供帮助,需要注意的是所用服务器不允许创建临时表。
非常感谢大家的帮助!
解决方案
你可以直接通过PostgreSQL内置的日期处理函数配合聚合查询实现需求,全程不需要创建临时表,符合服务器限制,具体SQL如下:
SELECT (EXTRACT(MONTH FROM TO_DATE(年月字段名::TEXT, 'YYYYMM')))::INT || '月' AS 月份, COUNT(*) AS 出现次数 FROM 你的表名 GROUP BY EXTRACT(MONTH FROM TO_DATE(年月字段名::TEXT, 'YYYYMM')) ORDER BY EXTRACT(MONTH FROM TO_DATE(年月字段名::TEXT, 'YYYYMM')) ASC;
代码说明:
- 先通过
TO_DATE函数将YYYYMM格式的数值/字符串类型的年月值转换为标准日期格式,再用EXTRACT函数提取月份数值,比手动截取字符的兼容性更高,避免格式异常问题 - 直接对提取出的月份字段做GROUP BY聚合统计总次数,没有涉及临时表创建操作
- 最后按月份数值升序排序,保证输出结果按1月到12月的正常顺序排列,不会出现字符串排序导致10月排在2月前面的乱序问题
如果你的年月字段是字符串类型,也可以用更轻量化的写法:
SELECT RIGHT(年月字段名, 2)::INT || '月' AS 月份, COUNT(*) AS 出现次数 FROM 你的表名 GROUP BY RIGHT(年月字段名, 2)::INT ORDER BY RIGHT(年月字段名, 2)::INT ASC;
内容的提问来源于stack exchange,提问作者Sid
相关产品推荐
相关产品推荐

