我正在与 PSQL/pgAdmin 合作,希望获得当年按月分组的库存总数。我尝试过 generated_series,但是当我尝试使用计数过滤器时,它似乎忽略了日期。
我的尝试
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
举个例子:
项目 | 安装日期 | 删除日期 |
---|---|---|
项目1 | 2024 年 1 月 | 2024 年 3 月 |
项目3 | 2024 年 2 月 | 2024 年 4 月 |
所以结果看起来像这样
月 | 安装计数 |
---|---|
一月 | 1 |
二月 | 2 |
三月 | 1 |
四月 | 0 |
所有月份均在日期范围内生成。
然后将每个月与
install_date
进行比较,并且removed_date 应大于month_start,以便将其排除在该月之外。
WITH month_series AS (
SELECT generate_series('2024-01-01'::date, '2024-12-01'::date, '1 month'::interval) AS month_start
)
SELECT
to_char(month_series.month_start, 'Mon YYYY') AS month,
COUNT(i.item) AS install_count
FROM
month_series
LEFT JOIN
inventory i
ON i.install_date <= month_series.month_start
AND (i.removed_date IS NULL OR i.removed_date > month_series.month_start)
GROUP BY
month_series.month_start
ORDER BY
month_series.month_start;
输出
月 | 安装计数 |
---|---|
2024 年 1 月 | 1 |
2024 年 2 月 | 2 |
2024 年 3 月 | 1 |
2024 年 4 月 | 0 |
2024 年 5 月 | 0 |
2024 年 6 月 | 0 |
2024 年 7 月 | 0 |
2024 年 8 月 | 0 |
2024 年 9 月 | 0 |
2024 年 10 月 | 0 |
2024 年 11 月 | 0 |
2024 年 12 月 | 0 |