gpt4 book ai didi

sql - 在 Postgresql 中的时间序列数据中添加缺失的每月日期

转载 作者:行者123 更新时间:2023-11-29 11:36:48 27 4
gpt4 key购买 nike

我在表中有每月时间序列数据,其中日期是一个月的最后一天。数据中缺少某些日期。我想插入这些日期并为其他属性设置零值。表格如下:

id     report_date   price
1 2015-01-31 40
1 2015-02-28 56
1 2015-04-30 34
2 2014-05-31 45
2 2014-08-31 47

我想把这个表转换成

id     report_date   price
1 2015-01-31 40
1 2015-02-28 56
1 2015-03-31 0
1 2015-04-30 34
2 2014-05-31 45
2 2014-06-30 0
2 2014-07-31 0
2 2014-08-31 47

有什么方法可以在 Postgresql 中做到这一点?目前我们正在用 Python 来做这件事。由于我们的数据与日俱增,仅针对一项任务处理 I/O 效率不高。

谢谢

最佳答案

您可以使用 generate_series() 生成日期,然后使用 left join 引入值:

with m as (
select id, min(report_date) as minrd, max(report_date) as maxrd
from t
group by id
)
select m.id, m.report_date, coalesce(t.price, 0) as price
from (select m.*, generate_series(minrd, maxrd, interval '1' month) as report_date
from m
) m left join
t
on m.report_date = t.report_date;

编辑:

事实证明,上面的方法并不完全有效,因为在月末添加月份并不能保留该月的最后一天。

这很容易修复:

with t as (
select 1 as id, date '2012-01-31' as report_date, 10 as price union all
select 1 as id, date '2012-04-30', 20
), m as (
select id, min(report_date) - interval '1 day' as minrd, max(report_date) - interval '1 day' as maxrd
from t
group by id
)
select m.id, m.report_date, coalesce(t.price, 0) as price
from (select m.*, generate_series(minrd, maxrd, interval '1' month) + interval '1 day' as report_date
from m
) m left join
t
on m.report_date = t.report_date;

第一个 CTE 只是为了生成示例数据。

关于sql - 在 Postgresql 中的时间序列数据中添加缺失的每月日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40902420/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com