我有一张表格,其中有4列:emp_no
,desig_name
,from_date
和to_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
答案 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