Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

subconsulta - obtendo a pontuação mais alta


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.