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

Posted

技术标签:

【中文标题】如何根据PostgreSQL中同一行的两个不同列更新具有唯一序列号的列?【英文标题】:How to update a column with unique serial number depending on two different columns of the same rows in PostgreSQL? 【发布时间】:2021-06-20 19:03:06 【问题描述】:

我有以下格式的记录列表(示例),由从数据库中连接多个表生成,其中条件:

Col1 Col2 Col3
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 的下一次迭代中再次重复。

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

Col1 Col2 Col3
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 等功能还很陌生。 如果有人对此有任何见解,以便有一种有效的方法来解决这个问题,那就太好了。

感谢您的帮助。

谢谢

【问题讨论】:

【参考方案1】:

您可以借助相关计数子查询来表述更新:

UPDATE yourTable t1
SET Col3 = (SELECT COUNT(*) FROM yourTable t2
            WHERE t2.Col1 = t1.Col1 AND t2.Col2 <= t1.Col2);

假设您向我们展示的输出是由连接产生的,您使用的实际查询可能比上面稍微复杂一些。但是,您应该能够遵循相同的模式。请注意,我的回答还假设与每个 Col1 值关联的 Col2 值始终是唯一的。

【讨论】:

感谢@Tim Biegeleisen。欣赏它。简单易行。【参考方案2】:

您可以使用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);

更新查询:

 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;

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

选择查询:

 select * from table1;

输出:

col1 col2 col3
100 200 1
100 201 2
100 202 3
100 203 4
101 204 1
101 205 2
102 206 1

db小提琴here

【讨论】:

感谢@Kazi 试用并给了我一个简单的解决方案。欣赏它。 @SunilCyriac 不客气。最良好的祝愿。

以上是关于如何根据PostgreSQL中同一行的两个不同列更新具有唯一序列号的列?的主要内容,如果未能解决你的问题,请参考以下文章

如何比较 Ag Grid 中同一行中的两个数据?

如何访问 Angular Material Data-Table 中同一行的不同单元格中的单元格的值?

如何在 PostgreSQL 11.1 中将现有列更改为身份

Matlab图例中同一行的两种不同颜色

r - 从数据框中同一行中的两个点创建线串

如何根据不同的 WHERE 选择一列并生成两个不同的列