O método tradicional é um analítico
MAX()
(ou outra função analítica):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
Mas eu provavelmente preferiria usar FIRST (GUARDA).
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'
Os benefícios de ambas as abordagens sobre o que você sugere inicialmente é que você verifica a tabela apenas uma vez, não há necessidade de acessar a tabela ou o índice uma segunda vez. Recomendo a postagem do blog de Rob van Wijk sobre as diferenças entre os dois.
P.S. eles retornarão resultados diferentes, portanto, são um pouco diferentes. A função analítica manterá duplicatas se dois alunos tiverem a mesma pontuação máxima (isso é o que sua sugestão também fará). A função de agregação removerá duplicatas, retornando um registro aleatório em caso de empate.