postgres - 按名称将一列更改为相同的值

时间:2015-09-28 07:20:48

标签: postgresql

例如我的列看起来像这样:

name | id | value 
A      1     aa 
A      2     ab 
B      3     bc 
C      4     ca 
C      5     cb

有没有办法改变它?

name | id | value 
A      1     aa 
A      1     ab 
B      3     bc 
C      4     ca 
C      4     cb

1 个答案:

答案 0 :(得分:2)

您可以使用对行进行编号的window function执行此操作,并使用该select语句提供更新的值:

update the_table
  set id = t.rn
from (
  select name, 
         id, 
         dense_rank() over (order by name)  as rn
  from the_table
) t
where (t.name, t.id) = (the_table.name, the_table.id);

SQLFiddle示例:http://sqlfiddle.com/#!15/0e987/1

这假设现有组合(id, name)是唯一的。如果不是这种情况,您需要使用ctid列来匹配内部选择和表本身之间的行:

update the_table
  set id = t.rn
from (
  select name, 
         id, 
         ctid,
         dense_rank() over (order by name)  as rn
  from the_table
) t
where t.ctid = the_table.ctid;