PostgreSQL分组查询后按月份名称排序失败,如何正确实现?
PostgreSQL按月份名称排序的正确实现方式
你之前的写法存在三个核心问题:
- GROUP BY仅使用转换后的月份名称字符串,未聚合的原始
purchase_date字段不在GROUP BY子句中,直接在ORDER BY引用该字段会触发语法错误 - 按
mes_2021排序本质是按字符串字典序排序,会出现四月排在一月前的问题,不符合时间顺序 - 你尝试的
date_part写法参数顺序颠倒,to_date用法不符合入参规则,因此无法生效
方案1:GROUP BY同时包含月份数值与月份名称(推荐)
该方案逻辑直观,性能损耗最小:
select to_char(purchase_date, 'Month') as mes_2021, sum(gmv::float4) as soma_gmv from tablename where purchase_date > '2021-01-01' GROUP BY date_part('month', purchase_date), mes_2021 ORDER BY date_part('month', purchase_date);
方案2:用聚合函数包裹排序字段(无需修改原GROUP BY)
如果不想调整原有GROUP BY逻辑,可以对排序字段增加聚合函数包裹:
select to_char(purchase_date, 'Month') as mes_2021, sum(gmv::float4) as soma_gmv from tablename where purchase_date > '2021-01-01' GROUP BY mes_2021 ORDER BY min(date_part('month', purchase_date));
内容的提问来源于stack exchange,提问作者merchmallow
相关产品推荐
相关产品推荐

