更新行 PostgreSQL

Update rows PostgreSQL

各位!

我有一个 table t(id, date1, date2):

id        date1           date2
 1    '2020-01-02'    '2020-01-02'
 1    '2020-01-12'    '2020-01-02'
 1    '2020-02-02'    '2020-01-02'
 1    '2020-03-02'    '2020-01-02'
 2    '2020-01-12'    '2020-01-02'
 2    '2020-01-15'    '2020-01-02'
 1    '2020-05-02'    '2020-01-02'
 1    '2020-06-02'    '2020-01-02'

我需要这样更新它:

id        date1           date2
 1    '2020-01-02'    '2020-01-11'
 1    '2020-01-12'    '2020-02-01'
 1    '2020-02-02'    '2020-02-01'
 1    '2020-03-02'    '2020-05-01'
 2    '2020-01-12'    '2020-01-14'
 2    '2020-01-15'    '2999-12-31'
 1    '2020-05-02'    '2020-06-01'
 1    '2020-06-02'    '2999-12-31'

在具有相同 ID 的行中:

date2 = date1 [from next row] - 1 

对于相同 ID 组中的最后一个日期 1:

date2 = '2999-12-31'

假设您可以按 iddate1 对列进行排序以便找到下一行,您可以使用按 id 分区的 LEAD获取列表中的下一项。

我复制你的案例:

create table test (id int, date1 date, date2 date);


insert into test values (1,'2020-01-02','2020-01-02');
insert into test values (1,'2020-01-12','2020-01-02');
insert into test values (1,'2020-02-02','2020-01-02');
insert into test values (1,'2020-03-02','2020-01-02');
insert into test values (2,'2020-01-12','2020-01-02');
insert into test values (2,'2020-01-15','2020-01-02');
insert into test values (1,'2020-05-02','2020-01-02');
insert into test values (1,'2020-06-02','2020-01-02');

我可以用

为每一行获取以下 date1
select 
    id, 
    date1, 
    date2, 
    coalesce(lead(date1, 1) OVER (PARTITION BY id ORDER BY id, date1),'2999-12-31')  date2_next 
from test;

结果

 id |   date1    |   date2    | date2_next
----+------------+------------+------------
  1 | 2020-01-02 | 2020-01-02 | 2020-01-12
  1 | 2020-01-12 | 2020-01-02 | 2020-02-02
  1 | 2020-02-02 | 2020-01-02 | 2020-03-02
  1 | 2020-03-02 | 2020-01-02 | 2020-05-02
  1 | 2020-05-02 | 2020-01-02 | 2020-06-02
  1 | 2020-06-02 | 2020-01-02 | 2999-12-31
  2 | 2020-01-12 | 2020-01-02 | 2020-01-15
  2 | 2020-01-15 | 2020-01-02 | 2999-12-31
(8 rows)

如果您要查找更新声明,请查看下面的声明

update test set date2=date2_next
from
(select id, 
    date1, 
    coalesce(lead(date1, 1) OVER (PARTITION BY id ORDER BY id, date1),'2999-12-31') date2_next 
from test) nxt
where test.id = nxt.id and test.date1=nxt.date1;