更新行 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'
假设您可以按 id
和 date1
对列进行排序以便找到下一行,您可以使用按 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;
各位!
我有一个 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'
假设您可以按 id
和 date1
对列进行排序以便找到下一行,您可以使用按 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;