postgresql 如何将多个字段值替换为另一个表中的值?

dwbf0jvd  于 2023-01-25  发布在  PostgreSQL
关注(0)|答案(2)|浏览(250)

我有两张table:表A

Id Status User
1   15    111
2   15    111
3   15    111

表B包含上表的状态变更历史:

Id IdA Status   Date
1   1   10   2023-01-18
2   1   30   2022-12-18
3   3   30   2022-01-17
4   3   10   2022-01-16

我需要做的是用表B中的值更新表A中用户111所在的每一行的状态字段值,我需要在表B中查找最新的实体更改,并将其状态写入表A中的相应实体。
因此,表A的最终结果应为:

Id Status User
1    10   111
2    15   111
3    30   111
cvxl0en2

cvxl0en21#

update tableA
set status = latest_data.status
from (select distinct on (idA)
       idA, status, date
      from   tableB
      -- helps to retrieve the latest update for each unique idA
      order by idA, date desc) latest_data
where latest_data.idA = tableA.id;
    • DISTINCT ON**子句参见文档。

有关详细信息,请参阅demo

jm81lzqq

jm81lzqq2#

根据IdA按日期升序排列表b,然后选择行号1更新表a。
Row_number()超过(排序依据...)
tableb是第二个表,tablen是第一个表

update tablen t1 set status = t2.status
from 
(select id, IDA, status from (
select *,
row_number ()over(partition by IDA order by daten desc) rnk
from tableb) x 
  where rnk = 1)t2 where t1.id = t2.idA;

此子句用于获取最后更新

select id, IDA, status from (
select *,
row_number ()over(partition by IDA order by daten desc) rnk
from tableb) x 
  where rnk = 1

相关问题