Menu
Coddy logo textTech

RANK & DENSE_RANK Functions

Parte da seção Fundamentos do Journey de SQL da Coddy — lição 65 de 72.

ROW_NUMBER() é um tipo de função de classificação, e há mais duas: RANK() e DENSE_RANK().

A função RANK() numera as linhas como ROW_NUMBER(), mas atribui números idênticos para as mesmas linhas e pula números. DENSE_RANK() é semelhante ao RANK(), mas não pula números.

Por exemplo:

idlevel
15
26
36
47
57
65
SELECT id, 
	ROW_NUMBER() OVER (ORDER BY level) as row_num,
	RANK() OVER (ORDER BY level) as row_rank,
	DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1

Isso retornará:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

Explicação:

  • ROW_NUMBER(): Sempre único: 1, 2, 3, 4, 5, 6
  • RANK():
    • nível 5 (2 linhas): ambos recebem rank 1
    • nível 6 (2 linhas): ambos recebem rank 3 (pula 2)
    • nível 7 (2 linhas): ambos recebem rank 5 (pula 4)
  • DENSE_RANK():
    • nível 5 (2 linhas): ambos recebem rank 1
    • nível 6 (2 linhas): ambos recebem rank 2 (sem pulo)
    • nível 7 (2 linhas): ambos recebem rank 3 (sem pulo)
challenge icon

Desafio

Fácil

Tabelas e colunas disponíveis:

  • <strong>medals</strong>: <strong>region</strong>, <strong>medal_color</strong>, <strong>medal_count</strong>

Crie uma consulta que mostre a região, contagem total de medalhas (soma de todas as medalhas independentemente da cor), e dois tipos de classificações:

  1. Um regular_rank (com lacunas) sobre a soma das medalhas
  2. Um dense_rank (sem lacunas) sobre a soma das medalhas

Ordene o resultado por:

order by total_medals desc, region asc

Folha de consulta

O SQL fornece três funções de classificação que se comportam de forma diferente com valores empatados:

  • ROW_NUMBER() - atribui números sequenciais únicos
  • RANK() - atribui o mesmo rank para valores empatados e pula os ranks subsequentes
  • DENSE_RANK() - atribui o mesmo rank para valores empatados sem pular ranks

Por exemplo:

idlevel
15
26
36
47
57
65
SELECT id, 
	ROW_NUMBER() OVER (ORDER BY level) as row_num,
	RANK() OVER (ORDER BY level) as row_rank,
	DENSE_RANK() OVER (ORDER BY level) as row_dense_rank
FROM table1

Isso retornará:

idrow_numrow_rankrow_dense_rank
1111
6211
2332
3432
4553
5653

Experimente você mesmo

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 Fundamentos