我有一个 PostgreSQL 服务器,其现有表具有固定宽度非唯一字符串列,例如:
| ID_STRING |
| 'ABCDEFG' |
| 'HIJKLMN' |
现在我想计算每个元素的整数 id 并将它们存储到一个附加列中。结果应如下所示:
| ID_STRING | ID_INT
| 'ABCDEFG' | 1
| 'HIJKLMN' | 2
| 'ABCDEFG' | 1
| 'HIJKLMN' | 2
有没有简单的方法来实现这一目标?
我有一个 PostgreSQL 服务器,其现有表具有固定宽度非唯一字符串列,例如:
| ID_STRING |
| 'ABCDEFG' |
| 'HIJKLMN' |
现在我想计算每个元素的整数 id 并将它们存储到一个附加列中。结果应如下所示:
| ID_STRING | ID_INT
| 'ABCDEFG' | 1
| 'HIJKLMN' | 2
| 'ABCDEFG' | 1
| 'HIJKLMN' | 2
有没有简单的方法来实现这一目标?
要添加新列,请使用:
要填充新列,您需要一个 UPDATE 语句。
我假设您的表中有一个名为的主键列
pk_column
。显然,您需要用表中的实际主键列替换它。如果你真的有一个没有主键的表(为什么?),你可以使用内置的
ctid
代替:您的要求有点难以理解。似乎您希望每个唯一字符串值都有一个唯一的 ID 值,但在整个数据集中不是唯一的,即如果您在数据集中多次使用 ABCDEF,则整数值在它们之间将是相同的。
如果是这样,您可以使用DENSE_RANK()函数生成基于非唯一字符串分组的递增整数 id。下面的例子:
结果:
注意:该示例来自 MS SQL Server,但 DENSE_RANK() 函数在 PostgreSQL 中的行为应该相同并使用相同的语法。