Sql 按以前的记录字段值更新字段

Sql 按以前的记录字段值更新字段,sql,database,postgresql,Sql,Database,Postgresql,我想从同一表中以前的记录日期字段更新日期字段,例如: ID_1 ID_2 start_date end_date 1 33 2017-12-14 10:28:32.203000 null 1 33 2017-12-13 10:28:29.153000 null 1 33

我想从同一表中以前的记录日期字段更新日期字段,例如:

ID_1   ID_2                  start_date                   end_date   
  1     33          2017-12-14 10:28:32.203000              null
  1     33          2017-12-13 10:28:29.153000              null    
  1     33          2017-12-12 10:28:25.246000              null    
  1     33          2017-12-11 10:28:21.917000              null    
  2      4          2017-12-10 10:28:18.005000              null    
  2      4          2017-12-09 10:28:14.145000              null    
  2      4          2017-12-08 13:24:26.964834              null
   ID_1  ID_2                start_date                   end_date   
    2      4            2017-12-08 13:24:26.964834     2017-12-09 10:28:14.145000
我想用具有相同ID_1和ID_2的记录中的上一个开始日期值更新结束日期字段。例如:

ID_1   ID_2                  start_date                   end_date   
  1     33          2017-12-14 10:28:32.203000              null
  1     33          2017-12-13 10:28:29.153000              null    
  1     33          2017-12-12 10:28:25.246000              null    
  1     33          2017-12-11 10:28:21.917000              null    
  2      4          2017-12-10 10:28:18.005000              null    
  2      4          2017-12-09 10:28:14.145000              null    
  2      4          2017-12-08 13:24:26.964834              null
   ID_1  ID_2                start_date                   end_date   
    2      4            2017-12-08 13:24:26.964834     2017-12-09 10:28:14.145000

谢谢

在Postgres中,您可以:

update t
    set end_date = tn.next_start_date
    from (select t.*,
                 lead(start_date) over (partition by id_1, id_2 order by start_date) as next_start_date
          from t
         ) tn
    where tn.id_1 = t.id_1 and tn.id_2 = t.id_2 and tn.start_date = t.start_date

似乎是滞后或超前函数的一个很好的例子。我会让其他精通PostgreSQL的人给你一个明确的答案。我确信你会得到一个关于如何做到这一点的答案,但是一旦你考虑了你是否真的想这么做。基本上,您在数据库中引入了重复数据,这在将来可能会导致许多其他问题。与其添加重复数据,不如考虑如何使用现有数据来完成应用程序中需要的任何操作(或者创建一个以有用的形式生成数据的视图)。非常感谢Gordon Linoff,但是在查询中似乎存在语法错误,我不确定,但我想“设置”。在“更新t”之后缺少,在“from(选择t.*)”之前也缺少“SELECT”,我有一条错误消息:[42P01]错误:表“t”的子句条目中缺少,在“set end_date=tn.next_start_date”之后的“from”似乎是maketrouble@MK-柔…那就是你的桌名所在。