Повторное упорядочение столбца с идентификатором в 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

Другие вопросы по тегам