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

ftf50wuq  于 2021-08-09  发布在  Java
关注(0)|答案(2)|浏览(448)

假设我们有当前的科目表和该科目每个学生的分数。
表:等级

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函数。

baubqpgj

baubqpgj1#

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

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

在子查询中,分析函数按降序排列每条记录 mark 在具有相同 subject . 然后,外部查询过滤每个组的顶部记录。如果有领带,则全部退回(您可以使用 row_number() 为了避免这种情况,或者向 order by 条款)。

kx5bkwkv

kx5bkwkv2#

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

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

注意:这只保留一个学生每科,即使有关系。你可以用 listagg() 把他们都弄到手。

相关问题