获取SQL(oracle)中每个类别的最大值
假设我们有当前的科目表和该科目每个学生的分数 表:职等获取SQL(oracle)中每个类别的最大值,sql,database,oracle,select,greatest-n-per-group,Sql,Database,Oracle,Select,Greatest N Per Group,假设我们有当前的科目表和该科目每个学生的分数 表:职等 Math: ANDY 80 Math: RYAN 70 Math: SARAH 95 Science: RYAN 60 Science: ANDY 90 Science: SARAH 75 我想写一个查询,以获得主题的名称,谁的分数最高,它是什么 查询的输出应如下所示: Math SARAH 95 Science ANDY 90 在oracle中,什么样的sql才能获得所需的输出?最好不使用windo
Math: ANDY 80
Math: RYAN 70
Math: SARAH 95
Science: RYAN 60
Science: ANDY 90
Science: SARAH 75
我想写一个查询,以获得主题的名称,谁的分数最高,它是什么
查询的输出应如下所示:
Math SARAH 95
Science ANDY 90
在oracle中,什么样的sql才能获得所需的输出?最好不使用windows函数。您可以使用分析函数
rank()
:
在子查询中,分析函数通过在具有相同
主题的组中降序标记对每个记录进行排序。然后,外部查询过滤每个组的顶部记录。如果存在联系,则所有联系都会被返回(您可以使用行编号()
来避免这种情况,或者在order by
子句中添加另一个排序条件)。您可以使用分析函数rank()
:
在子查询中,分析函数通过在具有相同主题的组中降序标记对每个记录进行排序。然后,外部查询过滤每个组的顶部记录。如果存在关联,它们都会返回(您可以使用行号()
来避免这种情况,或者在order by
子句中添加另一个排序条件)。在Oracle中,您可以通过聚合和保留来执行此操作:
select subject,
max(mark),
max(student) keep (dense_rank first order by mark desc)
from grades
group by subject;
注意:即使有联系,每个科目也只保留一名学生。您可以使用listag()
来获取所有这些属性。在Oracle中,您可以通过聚合和保留来实现这一点:
select subject,
max(mark),
max(student) keep (dense_rank first order by mark desc)
from grades
group by subject;
注意:即使有联系,每个科目也只保留一名学生。您可以使用listag()
获取所有这些信息。谢谢您抽出时间。真正地但是有没有一种不同的方法不使用windows函数呢。比如嵌套多个计数或条件?@A.Nassar:有替代方案,但可能效率较低。你为什么不想使用分析函数呢?谢谢你的时间。真正地但是有没有一种不同的方法不使用windows函数呢。比如嵌套多个计数或条件?@A.Nassar:有替代方案,但可能效率较低。你为什么不想用解析函数呢?