Plenowindow functionranking

RANK, DENSE_RANK e ROW_NUMBER: as diferenças que caem em prova

Publicado em 2025-02-18

Pergunta

Qual a diferença prática entre RANK, DENSE_RANK e ROW_NUMBER quando há empates?

Explicação

Os três retornam um inteiro ordenado por partição. A diferença está no tratamento de empates: ROW_NUMBER nunca empata; RANK pula posições; DENSE_RANK mantém a sequência sem pular.

Query SQL

sql
SELECT
  nome, pontos,
  ROW_NUMBER() OVER (ORDER BY pontos DESC) AS rn,
  RANK()       OVER (ORDER BY pontos DESC) AS rk,
  DENSE_RANK() OVER (ORDER BY pontos DESC) AS drk
FROM alunos;

Resposta esperada

Para pontuações 100, 100, 90: ROW_NUMBER = 1,2,3 | RANK = 1,1,3 | DENSE_RANK = 1,1,2.

Erros comuns

  • Usar ROW_NUMBER para podiums e ignorar empates legítimos
  • Usar RANK para top-3 e devolver mais ou menos itens que o esperado

Dica de entrevista

Top-N sem empate → ROW_NUMBER. Top-N com empate aceito → DENSE_RANK.

Compartilhar: