sql >> Base de Datos >  >> RDS >> Oracle

subconsulta - obtener la puntuación más alta

El método tradicional es un analítico MAX() (u otra función 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

Pero probablemente preferiría usar PRIMERO (MANTENER).

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'

Los beneficios de ambos enfoques sobre lo que sugiere inicialmente es que solo escanea la tabla una vez, no es necesario acceder a la tabla o al índice por segunda vez. Recomiendo encarecidamente la entrada de blog de Rob van Wijk sobre las diferencias entre los dos.

PD estos devolverán resultados diferentes, por lo que son ligeramente diferentes. La función analítica mantendrá duplicados si dos estudiantes tuvieran la misma puntuación máxima (esto es lo que hará su sugerencia también). La función agregada eliminará los duplicados y devolverá un registro aleatorio en caso de empate.