sql >> Database >  >> RDS >> Oracle

subquery - de hoogste score halen

De traditionele methode is een analyse MAX() (of andere analytische functie):

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

Maar ik zou waarschijnlijk liever EERSTE gebruiken (HOUDEN).

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'

De voordelen van beide benaderingen ten opzichte van wat u aanvankelijk voorstelt, is dat u de tabel slechts één keer scant, het is niet nodig om de tabel of de index een tweede keer te openen. Ik kan de blogpost van Rob van Wijk ten zeerste aanbevelen over de verschillen tussen de twee.

PS deze zullen verschillende resultaten opleveren, dus ze zijn iets anders. De analytische functie houdt duplicaten bij als twee studenten dezelfde maximale score hebben (dit is ook wat uw suggestie zal doen). De aggregatiefunctie verwijdert duplicaten en retourneert een willekeurig record in het geval van een gelijkspel.



  1. LIKE gebruiken in sp_executesql

  2. hoe kan ik een nieuw XML-bestand maken van een bestaande database in de PostgreSQL-database met behulp van java

  3. Twitter bootstrap typeahead retourneert meerdere waarden en vult de editbox

  4. Hoe kan ik alleen in een database invoegen als een waarde is gewijzigd?