PostgreSQL根据表字段生成月份和年份系列,如果没有给定月份的数据则填充空值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PostgreSQL根据表字段生成月份和年份系列,如果没有给定月份的数据则填充空值相关的知识,希望对你有一定的参考价值。
我希望从当前年的下个月(比如start_month
)到start_month
的12个月以及PostgreSQL中另一个表中的相应数据(如果有的话,还是返回空值)生成一系列的月份和年份。
SELECT ( ( DATE '2019-03-01' + ( interval '1' month * generate_series(0, 11) ) )
:: DATE ) dd,
extract(year FROM ( DATE '2019-03-01' + ( interval '1' month *
generate_series(0, 11) )
)),
coalesce(SUM(price), 0)
FROM items
WHERE s.date_added >= '2019-03-01'
AND s.date_added < '2020-03-01'
AND item_type_id = 3
GROUP BY 1,
2
ORDER BY 2;
上述查询的问题在于它为我所有月份的price
提供了相同的值。要求是,如果给定月份没有price
数据,则price
列将填充空值或零。
答案
把generate_series()
放在FROM
条款中。您正在总结数据 - 即计算整个范围内的价格 - 然后在所有月份进行预测。代替:
SELECT gs.yyyymm,
coalesce(SUM(i.price), 0)
FROM generate_series('2019-03-01'::date, '2020-02-01', INTERVAL '1 MONTH'
) gs(yyyymm) LEFT JOIN
items i
ON gs.yyyymm = DATE_TRUNC('month', s.date_added) AND
i.item_type_id = 3
GROUP BY gs.yyyymm
ORDER BY gs.yyyymm;
另一答案
你想在generate_series
条款中使用FROM
并加入它,有点像
SELECT months.m::date, ...
FROM generate_series(
start_month,
start_month + INTERVAL '11 months',
INTERVAL '1 month'
) AS months(m)
LEFT JOIN items
ON months.m::date = items.date_added
以上是关于PostgreSQL根据表字段生成月份和年份系列,如果没有给定月份的数据则填充空值的主要内容,如果未能解决你的问题,请参考以下文章
在数据库中,如果只需要年份和月份,您会使用日期字段还是年份和月份字段?