Quel est mon classement ?

Échauffement · window-functions, filtering, joins

Étant données 3 tables, students(id, name), courses(id, name), grades(id, course_id, student_id, grade),

trouvez le rang de l'étudiant 'Ahmed Abbas' dans le cours 'Database Systems'. Le rang vaut 1 plus

le nombre d'étudiants de ce cours ayant une note strictement supérieure, donc des notes égales

partagent le même rang. Renvoyez la colonne (student_rank).

Colonnes attendues

student_rank

Indices

Indice 1 : quelles lignes comptent

Seules les notes de 'Database Systems' déterminent ce rang. SHOW INDEX FROM grades montre un index sur course_id : MySQL peut donc lire uniquement les notes de ce cours au lieu des 40 000.

Indice 2 : quand la fenêtre s'exécute

Les fonctions de fenêtrage sont calculées après le WHERE. RANK() OVER (ORDER BY grade DESC) sur les notes d'un seul cours donne le même rang, mais filtrer sur le nom de l'étudiant en dehors de la fenêtre oblige à classer d'abord tous les cours.