【问题标题】:Postgres, add new lines for each missing daysPostgres,为每个缺失的日子添加新行
【发布时间】:2013-12-17 22:31:53
【问题描述】:

请原谅可能是个愚蠢的问题,但我不是数据库专家。

我有这张桌子:

id_data(串行)|日期(日期)

1               | 1984-02-10   
2               | 1984-02-12
3               | 1984-02-15

并且我想为每个缺失的日子添加新行 直到今天 ,比如这个:

id_data(串行)|日期(日期)

*               | 1984-02-10   
*               | 1984-02-11
*               | 1984-02-12
*               | 1984-02-13
*               | 1984-02-14
*               | 1984-02-15
...             | 2013-12-17 (today)

有可能吗? 提前致谢!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~

Nb : 表 2 显示了一个 select * from table order by udate

编辑:这是一个非常小的示例,因为我无法发布 1984 年至 2013 年之间的完整示例直到今天为止的每个失踪日。主要目标是在下表中说明我需要什么。

【问题讨论】:

  • 是的,但是您的示例显示了重复的 ID 数据,您说这些数据是串行的,因此不允许这样做——我可以编写查询来生成新日期和新的(附加的)ID,但不是具有重复的 ID。当我查看您预期结果的 ID 列时,我无法确定您使用什么逻辑来生成这些结果。
  • 实际上我搜索任何日期的查询,而不仅仅是这个。我将在我的主题中添加它以使其更准确:)
  • 您的新日期查询可能非常好,不要介意 ids 我只需要一个新行查询我的表中缺少的天数
  • 我编辑了我的答案以使她更准确,新的答案是:“我想为直到今天为止的每个缺失的日子添加新行”

标签: postgresql date row line add


【解决方案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;

当然,您需要根据上面的需要调整两个边界和起始值。

【讨论】:

  • 谢谢丹尼斯的回答。 Generate_serie 似乎是一个好项目!我对您的第 4 个查询有疑问,带有 select coalesce ... 的数字 4 不起作用(错误:id_data 不存在)
  • 您将序列命名为tmp_id_data_seq3
  • select nextval('tmp_id_data_seq3') 是否返回任何内容?
  • 是的,选择 nextval('tmp_id_data_seq');返回 13(然后是 14,15 等)
  • 那很好。在我的编辑中尝试data.id_data。该字段是您发布的字段名称,因此如果这不是您实际拥有的名称,请相应地调整列名称。顺便说一句,如果需要,您可以像select setval('tmp_id_data_seq', 3); 一样重新启动序列。坦率地说,我认为您应该只保留该字段为空,并担心稍后将 id 设置在更合适的位置。
猜你喜欢
  • 2021-07-15
  • 1970-01-01
  • 1970-01-01
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多