La méthode traditionnelle est une analytique
MAX()
(ou autre fonction analytique) :
select *
from ( select s.student_id
, w.last_name
, w.first_name
, s.numeric_grade
, max(s.numeric_grade) over () as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
)
where numeric_grade = numeric_final_grade
Mais je préférerais probablement utiliser PREMIER (GARDER).
select max(s.student_id) keep (dense_rank first order by s.numeric_grade desc) as student_id
, max(w.last_name) keep (dense_rank first order by s.numeric_grade desc) as last_name
, max(w.first_name) keep (dense_rank first order by s.numeric_grade desc) as first_na,e
, max(s.numeric_grade_name) as numeric_final_grade
from grade s
join section z
on s.section_id = z.section_id
join student w
on s.student_id = w.student_id
where z.course_no = 230
and z.section_id = 100
and s.grade_type_code = 'FI'
Les avantages de ces deux approches par rapport à ce que vous suggérez initialement sont que vous n'analysez la table qu'une seule fois, il n'est pas nécessaire d'accéder à la table ou à l'index une seconde fois. Je peux fortement recommander article de blog de Rob van Wijk sur les différences entre les deux.
PS ceux-ci renverront des résultats différents, ils sont donc légèrement différents. La fonction analytique maintiendra les doublons si deux étudiants ont le même score maximum (c'est ce que votre suggestion fera également). La fonction d'agrégation supprimera les doublons et renverra un enregistrement aléatoire en cas d'égalité.