PostgreSQL:如何在每个唯一客户的列中输入/更新数据并将其递增 1 直到表末尾

问题描述 投票:0回答:1

我请你帮我在数据库(PostgreSQL)中创建一个查询(或脚本)。我想在“number”列中写入值,这样对于每个唯一的客户端都会增加 1 个值。我已经搜索了所有 网上有资料,但我还是不知道该怎么做?

我的数据库看起来像这样:

id 数字 client_id 金额
193079 001 100900.00
193080 002 81900.00
193081 003 76400.00
193082 004 64800.00
193083 001 51200.00
193084 002 111348.57
193085 002 159962.87
193086 003 379492.86
193087 004 223358.30
193088 003 379492.86
193089 001 465358.30
193090 003 125358.30

我想要的是编写单个“更新”查询或脚本来修改我的表,如下所示:

id 数字 client_id 金额
193079 1 001 100900.00
193080 1 002 81900.00
193081 1 003 76400.00
193082 1 004 64800.00
193083 2 001 51200.00
193084 2 002 111348.57
193085 3 002 159962.87
193086 2 003 379492.86
193087 2 004 223358.30
193088 3 003 379492.86
193089 4 001 465358.30
193090 4 003 125358.30

我不太明白,我应该正确使用sequence和nextval功能吗?即使我可以/必须使用“sequence 和 nextval”,我也不知道如何正确使用它们! 请帮助我!

我正在使用 DBeaver 连接到我的数据库。 我尝试了几种类型的更新:

UPDATE "myDatabase".myTable SET "number" =(CASE WHEN client = 001 THEN nextval(1) WHEN client = 002 THEN nextval(1)  ... CASE WHEN number is not null THEN skip ELSE 'skip this row' END END     );

postgresql multiple-columns dbeaver
1个回答
0
投票

如果您希望将此作为一次性的

update
,请使用
row_number()
窗口函数并设置要按
client_id
分区的窗口:demo

with cte as (select id,row_number()over w1 as number
             from your_table
             window w1 as (partition by client_id order by id) )
update your_table this
set number=cte.number
from cte
where this.id=cte.id;

select * from your_table order by id;
e193087193088193089193090
id 数字 client_id 金额
193079 1 001 100900.00
193080 1 002 81900.00
193081 1 003 76400.00
193082 1 004 64800.00
193083 2 001 51200.00
193084 2 002 111348.57
193085 3 002 159962.87
193086 2379492.86
2 004 223358.30
3 003 379492.86
3 001 465358.30
4 003 125358.30
© www.soinside.com 2019 - 2024. All rights reserved.