【问题标题】:Update specific columns of rows in a group with last row in the group value使用组值中的最后一行更新组中行的特定列
【发布时间】:2020-04-21 20:31:47
【问题描述】:

考虑一下,我有以下表结构,我想用组值中的最后一行更新组中所有行的几列。输出应该是这样的:

所以我基本上根据entry_id 列更新了组中的行,并更新了组中所有行的line_numberentered_by 以匹配最后一行的值。

【问题讨论】:

  • 我删除了不一致的数据库标签。请标记您真正使用的数据库。

标签: sql postgresql group-by sql-update


【解决方案1】:

你可以使用下面的来得到你的结果

        WITH data
         AS (SELECT * FROM YOUR_TABLE),
         d1
         AS (SELECT entry_id,
                    Max(line_number)
                      over(
                        PARTITION BY entry_id
                        ORDER BY entry_id) line_number,
                    detailed_comment,
                    account_id
             FROM   data)
    SELECT d1.entry_id,
           d1.line_number,
           data.entered_by entered_by,
           d1.detailed_comment,
           d1.account_id
    FROM   d1,
           data
    WHERE  d1.entry_id = data.entry_id
           AND d1.line_number = data.line_number; 

首先使用create test_backup as select * from test 备份表,然后运行下面的 MERGE 语句

        MERGE INTO TEST s
    USING (
    SELECT distinct entry_id,
                        Max(line_number)
                          over(
                            PARTITION BY entry_id
                            ORDER BY entry_id) line_number,
                        detailed_comment,
                        account_id
                 FROM   TEST
    ) t
    ON (t.entry_id = s.entry_id )
    WHEN MATCHED THEN
    UPDATE SET s.entered_by= decode(s.line_number,t.line_number,s.entered_by,null),
    s.line_number=t.line_number

再运行下面的 MERGE 语句

        MERGE INTO TEST s
    USING (
    SELECT distinct entry_id, Max(entered_by)
                          over(
                            PARTITION BY entry_id
                            ORDER BY entry_id) entered_by,
                        detailed_comment,
                        account_id
                 FROM   TEST
    ) t
    ON (t.entry_id = s.entry_id)
    WHEN MATCHED THEN
    UPDATE SET s.entered_by=t.entered_by;

COMMIT;

【讨论】:

  • 合并在 postgres 中引发错误。另外,我们可以有一个合并查询来更新所有行吗?
  • 备份到临时表中删除 main_table 然后使用我的查询从临时表插入到主表
  • 但是如果有数百万行,这不会严重影响性能吗?
  • 您可以使用合并,但需要两次合并告诉我 postgres 中的错误将尝试修复
  • 似乎 postgres 10.12 不支持合并?我正在尝试使用 INSERT..ON CONFLICT UPDATE
猜你喜欢
  • 2021-11-05
  • 1970-01-01
  • 1970-01-01
  • 2016-08-28
  • 2018-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多