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 = 1Quer 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().
Desafio
FácilTabelas 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 = 1paraWHERE rn <= 3para obter os 3 primeiros - Troque
ROW_NUMBER()porRANK()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
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
3Agregação Condicional
COUNT com CASESUM com CASETransformando Linhas em ColunasRecapitulação - Fontes de Tráfego6Receitas de Analytics
Top-N por GrupoPercentual do TotalTotal AcumuladoMantendo uma Linha por ChaveRecapitulação - Melhores Clientes