例如我的列看起来像这样:
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
答案 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;