原谅可能是一个愚蠢的问题,但我不是一个数据库专家。
我有这张表:
id_data(serial)| udate(日期)
1 | 1984-02-10
2 | 1984-02-12
3 | 1984-02-15
我想为每个缺失的日子添加新行 直到今天 ,像这样:
id_data(serial)| udate(日期)
* | 1984-02-10
* | 1984-02-11
* | 1984-02-12
* | 1984-02-13
* | 1984-02-14
* | 1984-02-15
... | 2013-12-17 (today)
有可能吗? 提前致谢!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~
Nb:表2显示了udate
的select * from table order编辑:这是一个非常小的例子,因为我无法在1984年到2013年之间发布一个完整的例子,直到今天每个错过的日子。主要目标是在下表中说明我需要的内容。
答案 0 :(得分:1)
您可以使用generate_series()
生成空行:
select d::date
from generate_series(timestamp '1984-02-10',
timestamp '1984-02-15',
interval '1 day') d;
对于id生成,如果您不想使用表中的那个,请创建一个[临时]序列:
create temporary sequence tmp_id_data_seq start with 4;
然后,您可以生成新的ID:
select nextval('tmp_id_data_seq');
然后外连接两个:
select coalesce(data.id_data, nextval('tmp_id_data_seq')) as id_data,
d::date as udate
from generate_series(timestamp '1984-02-10',
timestamp '1984-02-15',
interval '1 day') dates (d)
left join data on data.udate = dates.d::date;
当然,您需要根据需要调整两个边界和起始值。