带循环的Postgres SQL脚本

时间:2015-10-30 02:58:20

标签: sql postgresql

我需要编写一个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}
}

但事实并非如此简单,因为我将日期与时间戳进行比较(我认为这会导致一些问题?),我也需要改进时间段。

所以我没有做date = {val.run_date},而是我需要检查日期是从凌晨4点开始的run_date,还是第二天凌晨4点。

所以说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查询来完成这些工作吗?

1 个答案:

答案 0 :(得分: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相当于使用<=>=