【问题标题】:Calculate maximum of column values with common value in another column in PostgreSQL计算PostgreSQL中另一列中具有共同值的列值的最大值
【发布时间】:2020-06-02 15:57:10
【问题描述】:

我正在尝试计算具有公共 id 的列值的最大值。

我有下表作为输入

TABLE 1:

| id    | seq    | score |
| ----- | ------ | ----- |
| UA502 | qrst   | 8.2   |
| UA502 | abcdef | 2.2   |
| UA504 | yzab   | 8.8   |
| UA504 | lmnop  | 2.8   |
| UA503 | uvwx   | 8.6   |
| UA503 | ghijk  | 2.6   |

想要的输出是:

| id    | seq    | score |
| ----- | ------ | ----- |
| UA502 | qrst   | 8.2   |
| UA504 | yzab   | 8.8   |
| UA503 | uvwx   | 8.6   |

我在另一个 WITH 查询 (union_data; 表 1) 的输出上运行带有 groupby 和 max 函数的 WITH 查询 (max_calc)。

max_calc as(

  select id, seq, max(score)
  from union_data
  GROUP BY id

  )

select * from max_calc
; 

我得到的错误是:

 Query Error: error: column "union_data.seq" must appear in the GROUP BY clause or be used in an aggregate function 

我不明白这个错误。我是根据 common id 而不是 seq 对数据进行分组的。为什么我应该在 GROUPBY 中包含列“union_data.seq”。

谢谢

【问题讨论】:

    标签: sql postgresql group-by max greatest-n-per-group


    【解决方案1】:

    在 Postgres 中,您可以为此使用 handy extension distinct on

    select distinct on (id) u.*
    from union_data u
    order by id, score desc
    

    【讨论】:

    • 在没有 MAX 函数的情况下如何计算最大值。对不起一个基本问题!
    • @rshar:这正是distinct on 的用途。诀窍在于order by 子句(按id 降序排列score)。您可以查看我在答案中提供的文档的链接。
    【解决方案2】:

    GMB 的答案是三栏的最佳答案(并且得到了适当的支持)。但是,如果您想要更多聚合,您可以使用数组模拟“第一个”聚合函数:

      select id,
             (array_agg(seq order by score desc))[1] as seq,
             max(score)
      from union_data
      group by id;
    

    【讨论】:

      【解决方案3】:

      前面给出的答案显示了如何纠正/规避原始错误。然而,他们没有解决关于错误原因的实际询问。所以让我们回到原来的查询。

        select id, seq, max(score)
        from union_data
        GROUP BY id 
      

      此查询导致错误。原因是分组中省略了非聚合列 seq。当聚合函数也在列列表中时,SQL 语法规则要求选择列表中的所有非聚合列都在“分组依据”子句中。这就是 Postgres 具有“distinct by”扩展名的原因。它本质上允许绕过 SQL 语法规则,但它不是免费的午餐。 Distinct By 提出了自己的要求。

      SELECT DISTINCT ON (表达式 [, ...] ) 只保留第一行 给定表达式计算结果为等于的每组行。这 DISTINCT ON 表达式使用与 for 相同的规则进行解释 订购(见上文)。请注意,每组的“第一行”是 不可预测,除非使用 ORDER BY 来确保所需的行 首先出现。 ... DISTINCT ON 表达式必须与 最左边的 ORDER BY 表达式。 ORDER BY 子句通常会 包含确定所需优先级的附加表达式 每个 DISTINCT ON 组中的行数。]

      【讨论】:

      • 感谢您的澄清!!
      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-08
      • 2018-09-30
      • 2021-10-10
      • 2013-06-21
      相关资源
      最近更新 更多