我请你帮我在数据库(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 );
如果您希望将此作为一次性的
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;
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 | 379492.86 | |
2 | 004 | 223358.30 | |
3 | 003 | 379492.86 | |
3 | 001 | 465358.30 | |
4 | 003 | 125358.30 |