PostgreSQL替代LAST_DAY实现月度固定成本分摊至当月销售记录
解决方案
PostgreSQL 无内置的 LAST_DAY() 函数,可通过内置的 date_trunc 函数实现等价的当月日期匹配逻辑,同时原查询末尾的GROUP BY 1,2,3属于无意义冗余(关联后每行销售记录仅匹配一条对应的月度固定成本,不会产生重复行),可直接移除。
最小修改方案(保留原查询整体结构)
仅替换报错的LAST_DAY表达式,其余逻辑与原查询保持一致:
SELECT s.sales_date, s.country, s.sales_volume, f.fix_costs FROM sales s JOIN ( SELECT (date_trunc('MONTH', sales_date) + INTERVAL '1 MONTH - 1 DAY')::date AS month_ld, SUM(fix_costs) AS fix_costs FROM sales WHERE country = 'None' GROUP BY month_ld ) f ON f.month_ld = (date_trunc('MONTH', s.sales_date) + INTERVAL '1 MONTH - 1 DAY')::date WHERE s.country <> 'None';
更高效的优化写法
无需分别计算两边的当月最后一天做匹配,直接用月份截断值作为关联键,减少日期运算开销,逻辑更简洁:
SELECT s.sales_date, s.country, s.sales_volume, f.fix_costs FROM sales s JOIN ( SELECT date_trunc('MONTH', sales_date) AS month_start, SUM(fix_costs) AS fix_costs FROM sales WHERE country = 'None' GROUP BY month_start ) f ON f.month_start = date_trunc('MONTH', s.sales_date) WHERE s.country <> 'None';
两种写法运行后均可得到完全符合预期的查询结果。
内容的提问来源于stack exchange,提问作者Michi
相关产品推荐
相关产品推荐

