Tradiční metodou je analytický
MAX()
(nebo jiná analytická funkce):
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
Ale pravděpodobně bych raději použil PRVNÍ (NECHAJTE).
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'
Výhody obou těchto přístupů oproti tomu, co původně navrhujete, je, že tabulku prohledáte pouze jednou, není třeba přistupovat k tabulce ani indexu podruhé. Mohu vřele doporučit příspěvek na blogu Roba van Wijka o rozdílech mezi nimi.
P.S. tyto vrátí jiné výsledky, takže se mírně liší. Analytická funkce bude udržovat duplikáty, pokud by dva studenti měli stejné maximální skóre (to je to, co váš návrh také udělá). Agregační funkce odstraní duplikáty a v případě shody vrátí náhodný záznam.