获取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()
获取所有这些。
假设我们有当前 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()
获取所有这些。