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().
Desafío
FácilTablas 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 = 1aWHERE rn <= 3para obtener los 3 mejores - Cambia
ROW_NUMBER()porRANK()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
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
3Agregación condicional
COUNT con CASESUM con CASEPivotar filas a columnasResumen - Fuentes de tráfico6Recetas de Analítica
Top-N por grupoPorcentaje del totalTotal acumuladoMantener una fila por claveResumen - Mejores clientes