用于多次更新的PostgreSQL查询

用于多次更新的PostgreSQL查询,sql,postgresql,select,Sql,Postgresql,Select,我有一个表,其中有4列:emp\u no,desig\u name,from\u date和to\u 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:0

我有一个表,其中有4列:
emp\u no
desig\u name
from\u date
to\u 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
因此,我的问题是将第一行的
更新到第二行的
from\u 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
您可以使用
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示例:

此表上是否有唯一字段?是的,还有一个列名“promotion\u id”,它是唯一字段promotion\u id是否指定了行的顺序?我没有正确获取它,根据您的回答,您首先将函数创建为“calc”然后运行更新查询?我使用PostgreSQL9。1@Anand:那是一句话。我的陈述中没有“功能”。你看过小提琴了吗?它将适用于Postgres 9.1。请不要使用“利特语”。写恰当的句子是礼貌和尊重的表现——特别是如果你要求免费帮助,我对此表示歉意。当我运行脚本时,我遇到了以下错误:“更新”处或附近的语法错误第8行:更新测试表^*********错误*******错误:在“更新”SQL状态处或附近出现语法错误:42601字符:184