Повторное упорядочение столбца с идентификатором в Postgresql
Следующий код работает и создает временную таблицу с порядковым номером, который перезапускается для каждого нового имени:
with results as (select row_number() over (partition by name order BY name) as mytid,name from telephn_table)
select * from results order by name
Моя цель, однако, состоит в том, чтобы постоянно вставить новый порядковый номер в телефонный стол. Как перенести новый порядковый номер из таблицы результатов в таблицу телефона? Я сталкивался со следующим для MySql, но не смог преобразовать его в Postgresql.
MySQL: добавить столбец последовательности на основе другого поля
Кто-нибудь может помочь?
2 ответа
Если память не изменяет, row_number()
возвращает номер в своем собственном разделе. Другими словами, row_number() over (partition by name order BY name)
вернет 1 для каждой строки, кроме дубликатов. Вы, вероятно, хотите rank() over (order by name)
вместо.
После долгого обсуждения:
update telephn_table
set sid = rows.new_sid
from (select pkey,
row_number() over (partition BY name) as new_sid,
name
from telephn_table
) as rows
where rows.pkey = telephn_table.pkey;
ЭТО РАБОТАЕТ! (См. Мою ссылку OP на предыдущую ссылку MySql. В Postgresql она работает без необходимости во временной таблице)
изменить таблицу telephn_table добавить столбец tid целое число по умолчанию 0; ОБНОВЛЕНИЕ telephn_table set tid=(SELECT count(*)+1 из telephn_table t, где t.sid