You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用PSQL/pgAdmin按月份统计可用库存数量的问题

按月份统计年度可用库存的PostgreSQL查询方案

问题背景

在PSQL/pgAdmin中需要按月份统计年度内的可用库存总数,尝试使用generate_series生成月份序列,但count的filter子句中日期条件未生效,无法得到正确结果。

原尝试代码

select
 g.day::date,
 count(item) filter(
 where install_date <= g.day+'1month'::interval
 and (removed_date is null or removed_date < g.day+'1month'::interval))
FROM table
CROSS JOIN generate_series('2024-01-01'::timestamp, '2025-01-01'::timestamp, '1 month'::interval) AS g(day)
group by 1,2

示例数据

物品安装日期移除日期
Item12024年1月2024年3月
Item32024年2月2024年4月

期望结果

月份可用库存数
1月1
2月2
3月1
4月0

修正后的查询代码

SELECT
    to_char(g.month_start, 'FMMM月') AS 月份,
    COUNT(t.item) AS 可用库存数
FROM (
    -- 生成2024年每个月的第一天
    SELECT generate_series('2024-01-01'::date, '2024-12-01'::date, '1 month'::interval) AS month_start
) AS g
LEFT JOIN your_table AS t
    ON t.install_date <= (g.month_start + interval '1 month' - interval '1 day')::date
    AND (t.removed_date IS NULL OR t.removed_date > g.month_start)
GROUP BY g.month_start
ORDER BY g.month_start;

关键修正说明

  • 日期逻辑调整:判断物品当月可用的正确条件是:
    • 安装日期不晚于当月最后一天(确保物品在当月已完成安装)
    • 移除日期为空(未移除)或移除日期晚于当月第一天(确保物品在当月至少有一天处于可用状态)
  • 分组修正:原代码错误地将count(item)纳入分组字段,导致结果异常,只需按月份起始日期分组即可
  • 生成准确月份边界:通过计算得到每个月的最后一天,避免直接使用+1month可能出现的日期计算误差(如2月天数问题)
  • LEFT JOIN用法:确保即使当月无可用物品,也能返回0的统计结果,符合期望中的4月数据

内容的提问来源于stack exchange,提问作者Patrick B

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 11:58:09