计算PostgreSQL中另一列中具有公共值的列值的最大值

计算PostgreSQL中另一列中具有公共值的列值的最大值,sql,postgresql,group-by,max,greatest-n-per-group,Sql,Postgresql,Group By,Max,Greatest N Per Group,我试图用公共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计算列值的最大值

我有下表作为输入

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   |
我在另一个查询union_数据的输出上运行以下带有groupby和max函数的query max_calc;表1

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 
我不理解这个错误。我正在根据公共id而不是序列对数据进行分组。为什么我应该在GROUPBY中包含列union_data.seq

谢谢

在Postgres中,您可以使用:

select distinct on (id) u.*
from union_data u
order by id, score desc
在Postgres中,您可以使用:

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

GMB的答案是三栏中最好的答案,并经过适当的投票。但是,如果需要更多聚合,可以使用数组模拟第一个聚合函数:

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

GMB的答案是三栏中最好的答案,并经过适当的投票。但是,如果需要更多聚合,可以使用数组模拟第一个聚合函数:

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

前面给出的答案说明了如何纠正/避免原始错误。然而,他们并没有解决关于错误原因的实际询问。因此,让我们回到原始查询

  select id, seq, max(score)
  from union_data
  GROUP BY id 
此查询导致错误。原因是分组中省略了非聚合列seq。当聚合函数也在列列表中时,SQL语法规则要求select列表中的所有非聚合列都在group by子句中。这就是为什么Postgres在扩展方面具有独特的优势。它本质上允许绕过SQL语法规则,但这不是免费的午餐。强加自己的要求

表达式[,…]上的SELECT DISTINCT仅保留 给定表达式计算结果相等的每组行。这个 DISTINCT ON表达式使用与for相同的规则进行解释 订购请参见上文。请注意,每组的“第一行”是 不可预测,除非使用ORDER BY来确保所需行 先出现。。。DISTINCT ON表达式必须与 最左边的按表达式排序。ORDER BY条款通常是 包含确定所需优先级的其他表达式 每个不同ON组中的行数。]


前面给出的答案说明了如何纠正/避免原始错误。然而,他们并没有解决关于错误原因的实际询问。因此,让我们回到原始查询

  select id, seq, max(score)
  from union_data
  GROUP BY id 
此查询导致错误。原因是分组中省略了非聚合列seq。当聚合函数也在列列表中时,SQL语法规则要求select列表中的所有非聚合列都在group by子句中。这就是为什么Postgres在扩展方面具有独特的优势。它本质上允许绕过SQL语法规则,但这不是免费的午餐。强加自己的要求

表达式[,…]上的SELECT DISTINCT仅保留 给定表达式计算结果相等的每组行。这个 DISTINCT ON表达式使用与for相同的规则进行解释 订购请参见上文。请注意,每组的“第一行”是 不可预测,除非使用ORDER BY来确保所需行 先出现。。。DISTINCT ON表达式必须与 最左边的按表达式排序。ORDER BY条款通常是 包含确定所需优先级的其他表达式 每个不同ON组中的行数。]


没有max函数,max是如何计算的。抱歉问了一个基本问题@rshar:这正是distinct on在这里的目的。诀窍在于order by子句按每个id的分数递减排序。您可以查看我在答案中提供的文档链接。没有max函数,max是如何计算的。抱歉问了一个基本问题@rshar:这正是distinct on在这里的目的。诀窍在于按每个id的分数降序排列的order by子句。您可以查看我在答案中添加的文档链接。感谢您的澄清!!谢谢你的澄清!!