Menu
Coddy logo textTech

Top-N par groupe

Fait partie de la section Au-delà des bases du Journey SQL de Coddy — leçon 23 sur 27.

« L'employé le mieux payé par département » est l'exemple type. La recette est toujours ROW_NUMBER() avec un PARTITION BY, puis un filtrage sur la ligne 1.

WITH ranked AS (
    SELECT name, department, salary,
           ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
    FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1

Vous voulez le top 3 au lieu du top 1 ? Remplacez WHERE rn = 1 par WHERE rn <= 3. Vous voulez autoriser les ex æquo en tête ? Remplacez ROW_NUMBER() par RANK().

challenge icon

Défi

Facile

Tables et colonnes disponibles :

  • <strong>employees</strong> : <strong>id</strong>, <strong>name</strong>, <strong>department</strong>, <strong>salary</strong>

Retournez l'employé le mieux payé dans chaque department. Affichez name, department et salary, ordonnés par department. Si deux employés sont à égalité pour le salaire le plus élevé au sein d'un département, n'en retournez qu'un seul : celui avec l'id le plus bas.

Aide-mémoire

Pour obtenir les N premières lignes par groupe, utilisez ROW_NUMBER() avec PARTITION BY, puis filtrez :

WITH ranked AS (
    SELECT name, department, salary,
           ROW_NUMBER() OVER (PARTITION BY department ORDER BY salary DESC) AS rn
    FROM employees
)
SELECT name, department, salary FROM ranked WHERE rn = 1
  • Remplacez WHERE rn = 1 par WHERE rn <= 3 pour obtenir les 3 premiers
  • Remplacez ROW_NUMBER() par RANK() pour autoriser les ex æquo

Essayez vous-même

WITH ranked AS (
    -- ROW_NUMBER() OVER (PARTITION BY department ORDER BY ...)
)
SELECT name, department, salary FROM ranked WHERE rn = 1
ORDER BY department
quiz iconTestez-vous

Cette leçon comprend un petit quiz. Commencez la leçon pour y répondre et suivre votre progression.

Toutes les leçons de Au-delà des bases