Обновить одну из дублирующихся строк Postgres
Есть таблица с полными дублями данных, допустим:
Create table Tbl (val1 int, val2 int, val3 date);
select *
from (values
(1, 2, now()), (1, 2, now()), (1, 2, now()) )
t(t1, t2, t3);
Дублей может быть сколь угодно много. Мне нужно сделать строки уникальными (конкретно, хочу добавить каждой дате по 1 секунде относительно предыдущей).
В ms sql я бы мог написать CTE с row_number'ом и updat'нуть само CTE - Постгрес такого не позволяет.
Есть ли возможность осуществить задуманное, не генеря доп столбец (с помощью которого можно будет различать записи)?
Ответы (1 шт):
Автор решения: ValNik
→ Ссылка
Если строки в таблице ничем не отличаются,
можно сделать различение записей через использование SEQUENCE
, который последовательно генерирует различные значения.
Посмотрите пример.
Create table Tbl (val1 int, val2 int, val3 timestamp);
insert into tbl
select *
from (values
(1, 2, now()), (1, 2, now()), (1, 2, now()) )
t(t1, t2, t3);
select * from tbl;
val1 | val2 | val3 |
---|---|---|
1 | 2 | 2024-04-11 12:46:30.152795 |
1 | 2 | 2024-04-11 12:46:30.152795 |
1 | 2 | 2024-04-11 12:46:30.152795 |
create temporary sequence tsec start 1 increment 1;
update tbl
set val3=val3+nextval('tsec')* interval '1 sec';
select * from tbl;
val1 | val2 | val3 |
---|---|---|
1 | 2 | 2024-04-11 12:46:31.152795 |
1 | 2 | 2024-04-11 12:46:32.152795 |
1 | 2 | 2024-04-11 12:46:33.152795 |