【问题标题】:How to UPDATE a column with MIN() and GROUP BY?如何使用 MIN() 和 GROUP BY 更新列?
【发布时间】:2019-08-07 15:59:27
【问题描述】:

我正在尝试根据 col2 中的值更新 col3。但我希望更新特定于其在 col1 中的唯一标识符(预订参考)。

我有过去一年的历史数据。每个预订参考每个月都会更新,因此我的表中每个唯一的预订参考都有 12 个值。

我正在尝试将 col3 设置为显示与该预订参考相关联的绝对最短日期。因此,在一个预订参考的 12 条记录中,如果最早的开始日期是 2018 年 3 月 12 日,那么它将将该日期放在与该预订参考关联的所有行的 col3 中。

我仔细查看了 stackoverflow 和 postgres 文档。我知道这应该作为一个聚合函数来完成,但是我还没有找到一个有效的解决方案。

UPDATE table1
SET "col3" = (SELECT MIN("col2")
FROM table1)

上面的代码遵循我认为应该工作的逻辑,但是它正在更新所有具有绝对最早日期的行,而不管与之关联的预订参考 (col1) 是什么。

我知道 GROUP BY 可能用于解决此问题,但我不知道如何正确包含它。

【问题讨论】:

    标签: postgresql sql-update


    【解决方案1】:

    您并没有真正向我们展示表结构(并且使用混淆的名称使其更难理解),但听起来好像您需要一个共同相关的子查询

    update the_table
      set col3 = (select min(col2)
                  from the_table t2
                  where t2.col1 = the_table.col1);
    

    一个可能更快的解决方案是进行一次聚合并使用该结果进行更新:

    update the_table
       set col3 = t.min_col2
    from (
      select t2.col1, min(t2.col2) as min_col2
      from the_table t2
      group by t2.col1
    ) s 
    where s.col1 = the_table.col1;
    

    【讨论】:

    • 谢谢你,第一个示例按预期工作。我会记下并确保为以后的任何问题提供更多的表格结构!
    猜你喜欢
    • 1970-01-01
    • 2013-04-06
    • 2013-05-19
    • 1970-01-01
    • 1970-01-01
    • 2013-02-16
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多