如何根据 PostgreSQL 中同一行的两个不同列更新具有唯一序列号的列?

Sun*_*iac 4 sql postgresql stored-procedures row-number greatest-n-per-group

我有一个以下格式的记录列表(示例),是通过连接数据库中的多个表和条件条件生成的:

第 1 列 第2栏 第3栏
100 200 1
100 201 1
100 第202章 1
100 203 1
101 204 1
101 205 1
102 206 1
102 207 1

我想要的是根据 Col1 和 Col2 中的值更新上例中 Col3 中的值。

这个想法是首先循环 Col1,然后再循环 Col2,并从 1 开始更新 Col3 中的值,每次迭代 Col2 记录时增加 1。对于 Col1 的下一次迭代,应再次重复此操作。

上述方法的预期输出示例为:

第 1 列 第2栏 第3栏
100 200 1
100 201 2
100 第202章 3
100 203 4
101 204 1
101 205 2
102 206 1
102 207 2

使用的数据库是postgres,我对postgres中的cursor等功能还很陌生。如果有人对此有任何见解并能找到一种有效的方法来解决这个问题,那就太好了。

感谢您的帮助,谢谢。

谢谢

Kaz*_*Nur 6

row_number()over()您可以使用排名窗口函数轻松实现此目的:

架构和插入语句:

 create table table1(Col1 int,  Col2    int,Col3 int);
 insert into table1 values(100  ,200    ,1);
 insert into table1 values(100  ,201    ,1);
 insert into table1 values(100  ,202    ,1);
 insert into table1 values(100  ,203    ,1);
 insert into table1 values(101  ,204    ,1);
 insert into table1 values(101  ,205    ,1);
 insert into table1 values(102  ,206    ,1);
Run Code Online (Sandbox Code Playgroud)

更新查询:

 with cte as(
    select col1,col2,col3, row_number()over (partition by col1 order by col2) rn from table1
 )
 update table1 set col3=cte.rn
 from cte
 where table1.col1=cte.col1 and table1.col2=cte.col2;
Run Code Online (Sandbox Code Playgroud)

在上面的查询中,row_number()over (partition by col1 order by col2)将为 col1 中的每个不同值生成一个唯一序列,从 1 开始,按 col2 排序。

选择查询:

 select * from table1;
Run Code Online (Sandbox Code Playgroud)

输出:

第 1 列 列2 第 3 列
100 200 1
100 201 2
100 第202章 3
100 203 4
101 204 1
101 205 2
102 206 1

db<>在这里摆弄