带有循环的 Postgres SQL 脚本

Posted

技术标签:

【中文标题】带有循环的 Postgres SQL 脚本【英文标题】:Postgres SQL script with loop 【发布时间】:2016-01-30 09:42:28 【问题描述】:

我需要编写一个 Postgres 脚本来遍历我在特定表中的所有行,获取该行中的日期列,找到另一个表中具有该日期的所有行,并将该行的 ID 分配给该行其外键列的第一行。进一步解释,我的数据(简化)如下所示:

first_table:

id INT, run_date DATE

第二张桌子:

id INT, target_date TIMESTAMP, first_table_id INT

伪代码:

first_table_array = SELECT * FROM first_table;
i, val = range first_table_array 
   UPDATE second_table SET first_table_id=val.id WHERE date=val.run_date

但实际上并不是那么简单,因为我将日期与时间戳进行比较(我认为这会导致一些问题?),并且我还需要优化时间段。

因此,我实际上需要检查日期是否从凌晨 4 点开始到第二天凌晨 4 点,而不是执行 where date=val.run_date。

所以说 run_date 是 01/01/2015,我需要将该值转换为 01/01/2015 04:00:00 的时间戳,然后创建另一个时间戳 01/02/2015 04:00:00 ,然后做:

where date > first_date AND date < second_date. 

所以,是这样的:

伪代码:

first_table_array = SELECT * FROM first_table;
i, val = range first_table_array 
   first_date = timestamp(val.run_date) + 4 hrs
   second_date = timestamp(val.run_date + 1 day) + 4 hrs
   UPDATE second_table SET first_table_id=val.id WHERE date > first_date AND date < second_date

postgres 有能力做这种事情,还是我最好写一个脚本来做这件事?我是否需要使用循环,或者我可以仅使用连接和标准 SQL 查询来完成这些工作吗?

【问题讨论】:

你能发布一些带有期望输出的真实数据样本吗?你也可以尝试创建一个sqlfiddle.com 【参考方案1】:

我已经尽力了。数据样本会很棒。

 UPDATE second_table ST
 SET ST.id = FT.id
 FROM first_table FT
 WHERE ST.date BETWEEN FT.run_date + interval '4 hour'
                   AND FT.run_date + interval '4 hour' + interval '1 day'

How to do an update + join in PostgreSQL?

http://www.postgresql.org/docs/9.1/static/functions-datetime.html

注意:

BETWEEN 等价于使用&lt;=&gt;=

【讨论】:

非常感谢,太完美了!很高兴看到我不需要任何复杂的东西,比如循环或脚本。

以上是关于带有循环的 Postgres SQL 脚本的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Postgres 在 SQL 中执行 for 循环?

从java调用带有UDT参数的postgres函数给SQL尚未实现异常

postgres循环sql

sql 用于群集构建的Postgres脚本

如何在 Docker 中为 Postgres 运行 sql 脚本?

带有嵌套 SQL 查询或如何查找最后一个 INET 的 Postgres 视图