首页 > 解决方案 > 用序号替换“顺序”列中的内容

问题描述

我在 postgres 数据库的表中有一个“订单”列,其中序列中有很多缺失的数字。我在弄清楚如何用增量的新数字替换列中当前的数字时遇到问题(参见示例)。

我有的:

 id  order  name
 ---------------
  1    50   Anna
  2    13   John
  3     2   Bruce
  4     5   David

我想要的是:

 id  order  name
 ---------------
  1     4   Anna
  2     3   John
  3     1   Bruce
  4     2   David

在旧版本的列中包含最低订单号的行应该得到新的订单号“1”,之后的下一个应该得到“2”等等。

标签: postgresql

解决方案


您可以使用窗口函数 row_number()来计算新数字。其结果可用于更新语句:

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

这假定这id是该表的主键。


推荐阅读