0Pricing
SQL Academy · Aula

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

  1. OVER, PARTITION BY, ORDER BY
  2. ROW_NUMBER, RANK, DENSE_RANK
  3. LAG, LEAD e padrões de séries temporais
  4. Totais acumulados e médias móveis
← Voltar para SQL Academy