获取SQL(oracle)中每个类别的最大值

Get the maximum value of values for each category in SQL(oracle)

假设我们有当前 table 个科目和每个学生在该科目中的分数。

Table:成绩

Math:    ANDY  80
Math:    RYAN  70
Math:    SARAH 95 
Science: RYAN  60
Science: ANDY  90
Science: SARAH 75

我想写一个查询来获取主题的名称,谁的分数最高,是什么。

查询的输出应如下所示:

Math    SARAH 95
Science ANDY  90

什么是 sql(在 Oracle 中)才能获得所需的输出?最好不使用 windows 函数。

可以使用解析函数rank():

select *
from (
    select g.*, rank() over(partition by subject order by mark desc) rn
    from grades
) t
where rn = 1

在子查询中,分析函数通过在具有相同 subject 的组内降序 mark 对每个记录进行排名。然后,外部查询过滤每组的顶部记录。如果有关系,则全部返回(您可以使用 row_number() 来避免这种情况,或者在 order by 子句中添加另一个排序标准)。

在 Oracle 中,您可以使用聚合和 keep:

select subject,
       max(mark),
       max(student) keep (dense_rank first order by mark desc)
from grades
group by subject;

注意:每个科目只保留一名学生,即使有联系。您可以使用 listagg() 获取所有这些。