Menu
Coddy logo textTech

Top-N por grupo

Parte de la sección Más allá de lo básico del Journey de SQL de Coddy — lección 23 de 27.

"Empleado mejor pagado por departamento" es el ejemplo de libro de texto. La receta es siempre ROW_NUMBER() con un PARTITION BY, luego filtrar por la fila 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

¿Quieres el top 3 en lugar del top 1? Cambia WHERE rn = 1 por WHERE rn <= 3. ¿Quieres permitir empates en las primeras posiciones? Sustituye ROW_NUMBER() por RANK().

challenge icon

Desafío

Fácil

Tablas y columnas disponibles:

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

Devuelve al empleado mejor pagado en cada department. Muestra name, department y salary, ordenados por department. Si dos empleados empatan en el primer puesto dentro de un departamento, devuelve solo uno: el que tenga el id más bajo.

Hoja de referencia

Para obtener las primeras N filas por grupo, utiliza ROW_NUMBER() con PARTITION BY, y luego filtra:

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
  • Cambia WHERE rn = 1 a WHERE rn <= 3 para obtener los 3 mejores
  • Cambia ROW_NUMBER() por RANK() para permitir empates

Pruébalo tú mismo

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

Esta lección incluye un breve cuestionario. Empieza la lección para responderlo y registrar tu progreso.

Todas las lecciones de Más allá de lo básico