计算PostgreSQL中另一列中具有公共值的列值的最大值
我试图用公共id计算列值的最大值 我有下表作为输入计算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
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子句。您可以查看我在答案中添加的文档链接。感谢您的澄清!!谢谢你的澄清!!