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等功能还很陌生。如果有人对此有任何见解并能找到一种有效的方法来解决这个问题,那就太好了。
感谢您的帮助,谢谢。
谢谢
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<>在这里摆弄
| 归档时间: |
|
| 查看次数: |
1346 次 |
| 最近记录: |