ROW_NUMBER, RANK, DENSE_RANK
Numere e classifique linhas dentro de partições e escolha a função de classificação adequada para empates.
ROW_NUMBER, RANK, DENSE_RANK é uma aula grátis de SQL Academy no CoddyKit. Esta é a aula 2 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de SQL Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de SQL Academy inclui 4 aulas no total.
Três Funções de Numeração
Três funções de janela que numeram linhas dentro de uma partição:
ROW_NUMBER()— 1, 2, 3, 4 (sempre únicos)RANK()— 1, 2, 2, 4 (empates compartilham a posição e depois há um salto)DENSE_RANK()— 1, 2, 2, 3 (empates compartilham a posição, sem salto)
ROW_NUMBER
Atribui 1, 2, 3 dentro de cada partição. Empates são resolvidos arbitrariamente — forneça um critério de desempate em ORDER BY para obter determinismo:
SELECT id, user_id, total,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC, id
) AS rn
FROM orders;Os N Melhores por Grupo
O uso clássico de ROW_NUMBER:
WITH ranked AS (
SELECT *,
ROW_NUMBER() OVER (
PARTITION BY user_id ORDER BY total DESC
) AS rn
FROM orders
)
SELECT * FROM ranked WHERE rn <= 3;
-- Each user's top 3 orders.RANK
Linhas com o mesmo valor de ORDER BY recebem a mesma posição; o próximo valor distinto deixa um intervalo:
-- totals: 100, 90, 90, 70
-- RANK: 1, 2, 2, 4 (skipped 3)
SELECT id, total,
RANK() OVER (ORDER BY total DESC) AS rk
FROM orders;DENSE_RANK
Igual a RANK, mas sem intervalos:
-- totals: 100, 90, 90, 70
-- DENSE: 1, 2, 2, 3
SELECT id, total,
DENSE_RANK() OVER (ORDER BY total DESC) AS dr
FROM orders;Escolhendo entre Elas
- Precisa de números únicos (por exemplo, para paginação)?
ROW_NUMBER - Classificação com o tradicional "empates deixam intervalos"?
RANK - Classificação com "empates compartilham a posição, a próxima é a seguinte"?
DENSE_RANK
NTILE: Faixas de N Quantis
NTILE(n) distribui as linhas em n faixas aproximadamente iguais:
SELECT id, total,
NTILE(4) OVER (ORDER BY total) AS quartile
FROM orders;
-- 1 = bottom 25%, 4 = top 25%Removendo Linhas Duplicadas
Use ROW_NUMBER + DELETE para manter uma linha por grupo de duplicatas:
WITH dups AS (
SELECT id,
ROW_NUMBER() OVER (PARTITION BY email ORDER BY id) AS rn
FROM users
)
DELETE FROM users WHERE id IN (SELECT id FROM dups WHERE rn > 1);Paginação por Grupo
Página 2 de "pedidos de cada usuário, 5 por página":
WITH r AS (
SELECT id, user_id,
ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY created_at DESC) AS rn
FROM orders
)
SELECT * FROM r WHERE rn BETWEEN 6 AND 10;PERCENT_RANK e CUME_DIST
Posição relativa na partição:
SELECT id, total,
PERCENT_RANK() OVER (ORDER BY total) AS pct_rank,
CUME_DIST() OVER (ORDER BY total) AS cume_dist
FROM orders;Desempenho
Funções de numeração precisam de entradas ordenadas dentro de cada partição. Um índice em (partition_col, order_col) pode evitar a etapa de ordenação.
Recapitulação
Três funções de numeração atendem à maioria das necessidades.
- ROW_NUMBER para exclusividade
- RANK / DENSE_RANK para classificação com empates
- NTILE para faixas de quantis
Verificação rápida
Dado o total 100, 90, 90, 70, qual saída DENSE_RANK produz?
Perguntas Frequentes
A aula “ROW_NUMBER, RANK, DENSE_RANK” é grátis?
Sim — o texto completo de “ROW_NUMBER, RANK, DENSE_RANK” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de SQL Academy, atualize para CoddyKit PRO. O curso de SQL Academy inclui 4 aulas no total.
O que vou aprender em “ROW_NUMBER, RANK, DENSE_RANK”?
Numere e classifique linhas dentro de partições e escolha a função de classificação adequada para empates. Você pratica SQL Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar SQL Academy?
Nenhuma experiência prévia é necessária. SQL Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 2 de 4.
Quanto tempo leva a aula “ROW_NUMBER, RANK, DENSE_RANK”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de SQL Academy?
Sim. Cada aula de SQL Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- OVER, PARTITION BY, ORDER BY
- ROW_NUMBER, RANK, DENSE_RANK
- LAG, LEAD e padrões de séries temporais
- Totais acumulados e médias móveis