Menu
Coddy logo textTech

Top-N por Grupo

Parte da seção Além do Básico do Journey de SQL da Coddy — lição 23 de 27.

"Funcionário mais bem pago por departamento" é o exemplo clássico. A receita é sempre ROW_NUMBER() com um PARTITION BY, depois filtre para a linha 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

Quer o top 3 em vez do top 1? Altere WHERE rn = 1 para WHERE rn <= 3. Quer permitir empates no topo? Troque ROW_NUMBER() por RANK().

challenge icon

Desafio

Fácil

Tabelas e colunas disponíveis:

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

Retorne o funcionário mais bem pago em cada department. A saída deve conter name, department e salary, ordenados por department. Se dois funcionários empatarem no topo dentro de um departamento, retorne apenas um: aquele com o menor id.

Folha de consulta

Para obter as primeiras N linhas por grupo, use ROW_NUMBER() com PARTITION BY e, em seguida, filtre:

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
  • Altere WHERE rn = 1 para WHERE rn <= 3 para obter os 3 primeiros
  • Troque ROW_NUMBER() por RANK() para permitir empates

Experimente você mesmo

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

Esta lição inclui um quiz rápido. Comece a lição para respondê-lo e acompanhar seu progresso.

Todas as lições de Além do Básico