De traditionele methode is een analyse
MAX()
(of andere analytische functie):
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
Maar ik zou waarschijnlijk liever EERSTE gebruiken (HOUDEN).
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'
De voordelen van beide benaderingen ten opzichte van wat u aanvankelijk voorstelt, is dat u de tabel slechts één keer scant, het is niet nodig om de tabel of de index een tweede keer te openen. Ik kan de blogpost van Rob van Wijk ten zeerste aanbevelen over de verschillen tussen de twee.
PS deze zullen verschillende resultaten opleveren, dus ze zijn iets anders. De analytische functie houdt duplicaten bij als twee studenten dezelfde maximale score hebben (dit is ook wat uw suggestie zal doen). De aggregatiefunctie verwijdert duplicaten en retourneert een willekeurig record in het geval van een gelijkspel.