PostgreSQL查询多次更新

时间:2014-01-20 11:08:56

标签: sql postgresql select

我有一张表格,其中有4列:emp_nodesig_namefrom_dateto_date

emp_no  desig_name       from_date                  to_date
1001    engineer         2004-08-01 00:00:00
1001    sr.engineer      2010-08-01 00:00:00
1001    chief.engineer   2013-08-01 00:00:00

所以我的问题是在第二行的to_date之前和第二行的第一行更新第一行from_date列吗?

更新后,它应如下所示:

emp_no  desig_name       from_date                  to_date
1001    engineer         2004-08-01 00:00:00        2010-07-31 00:00:00
1001    sr.engineer      2010-08-01 00:00:00        2013-07-31 00:00:00
1001    chief.engineer   2013-08-01 00:00:00

1 个答案:

答案 0 :(得分:1)

您可以使用lead()功能计算“下一个”日期。

然后可以使用此计算值更新表格:

with calc as (
  select promotion_id, 
         emp_no, 
         from_date, 
         lead(from_date) over (partition by emp_no order by from_date) as next_date
  from emp
)
update emp 
   set to_date = c.next_date - interval '1' day
from calc c
  where c.promotion_id = emp.promotion_id;

正如您所看到的,获取该值非常简单,存储派生信息通常不是一个好主意。您可能需要考虑一个即时计算此信息的视图,这样您每次插入新行时都不需要更新表。

SQLFiddle示例:http://sqlfiddle.com/#!15/31665/1