Oracle
 sql >> Base de données >  >> RDS >> Oracle

sous-requête - obtenir le score le plus élevé

La méthode traditionnelle est une analytique MAX() (ou autre fonction analytique) :

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

Mais je préférerais probablement utiliser PREMIER (GARDER).

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'

Les avantages de ces deux approches par rapport à ce que vous suggérez initialement sont que vous n'analysez la table qu'une seule fois, il n'est pas nécessaire d'accéder à la table ou à l'index une seconde fois. Je peux fortement recommander article de blog de Rob van Wijk sur les différences entre les deux.

PS ceux-ci renverront des résultats différents, ils sont donc légèrement différents. La fonction analytique maintiendra les doublons si deux étudiants ont le même score maximum (c'est ce que votre suggestion fera également). La fonction d'agrégation supprimera les doublons et renverra un enregistrement aléatoire en cas d'égalité.