sql >> Databáze >  >> RDS >> Oracle

poddotaz - získání nejvyššího skóre

Tradiční metodou je analytický MAX() (nebo jiná analytická funkce):

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

Ale pravděpodobně bych raději použil PRVNÍ (NECHAJTE).

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'

Výhody obou těchto přístupů oproti tomu, co původně navrhujete, je, že tabulku prohledáte pouze jednou, není třeba přistupovat k tabulce ani indexu podruhé. Mohu vřele doporučit příspěvek na blogu Roba van Wijka o rozdílech mezi nimi.

P.S. tyto vrátí jiné výsledky, takže se mírně liší. Analytická funkce bude udržovat duplikáty, pokud by dva studenti měli stejné maximální skóre (to je to, co váš návrh také udělá). Agregační funkce odstraní duplikáty a v případě shody vrátí náhodný záznam.



  1. odevzdat po výběru

  2. postgresql spojení 2 tabulek

  3. Ukládání souborů do SQL databáze pomocí FILESTREAM – část 2

  4. MySQL COUNT() ve více sloupcích