Voltar para a lista de artigos Artigos
6 minutos de leitura

Qual é a função do RANK() em SQL, e como você a utiliza?

Quem são seus 10 principais clientes? Quem são os funcionários com melhor desempenho em cada departamento? Para responder perguntas como estas, você precisará classificar a saída de sua consulta SQL. Vamos ver como a função RANK() auxilia na classificação dos resultados em SQL.

Há muitos casos de uso em que você pode precisar classificar as linhas em SQL. Você pode querer classificar clientes com base no volume de vendas, estudantes com base nos resultados de seus exames, ativos da empresa com base em seu valor atual, departamentos com base no número de funcionários, ou usuários com base na data de sua inscrição.

A classificação é uma ferramenta importante e comum na análise de dados. Neste tutorial, vou fornecer explicações detalhadas de como classificar as linhas em SQL.

RANK() Introdução à função

A função RANK() é uma das funções de janela em SQL. As funções de janela olham parte dos dados e computam os resultados para esta parte.

A função RANK(), especificamente, atribui uma classificação a cada linha com base em uma coluna fornecida. RANK() está incluída na declaração SELECT com a seguinte sintaxe:

RANK() OVER (ORDER BY column ASC|DESC)

Basicamente, você adiciona outra coluna ao seu conjunto de resultados. Esta coluna inclui a classificação de cada registro com base na ordem especificada após a palavra-chave ORDER BY. Isto implica especificar (1) a coluna a ser usada para ordenar as linhas e (2) se a ordem deve ser ascendente ou descendente.

A primeira linha recebe a classificação 1, e as linhas seguintes recebem classificações mais altas. Se alguma linha tiver o mesmo valor na coluna usada para ordenação, ela é classificada da mesma forma. A função RANK() deixa lacunas em tais casos.

Por exemplo, se a primeira e a segunda linhas tiverem o mesmo valor na coluna fornecida, ambas obtêm a classificação 1. Em seguida, a terceira linha recebe a classificação 3 (ou seja, faltará a classificação 2).

Para ficar confiante com a função RANK(), confira nossa Funções de Janela (Window Functions) em SQL curso. Também cobre outras funções de classificação que têm abordagens diferentes para processar os mesmos valores na coluna fornecida.

Agora, vamos ver a função RANK() em ação.

Ranking básico

Para ver como a função RANK() funciona na prática, vamos passar por um exemplo. Vamos imaginar que temos uma equipe de desenvolvedores. Queremos classificá-los com base em sua experiência. Aqui está a tabela com a qual começamos:

developers
idfirst_namelast_namelevelyears_experience
10JackDavisjunior1
11HelenBrownjunior0
12KateWilliamssenior4
13AlexMillersenior8
14SophiaMooremid-level3
15NickJacksonmid-level3
16StevenMartinjunior2
17MeganStevensjunior1
18JohnJonessenior5
19MaxWebermid-level4

Agora, nossa tarefa é mostrar o primeiro nome, sobrenome, nível de senioridade, anos de experiência e classificação dos desenvolvedores. Queremos que o desenvolvedor mais experiente consiga a classificação 1.

Aqui está nossa consulta SQL junto com o conjunto de resultados:

SELECT first_name, last_name, level, years_experience,
       RANK() OVER (ORDER BY years_experience DESC)
FROM developers;
first_namelast_namelevelyears_experiencerank
AlexMillersenior81
JohnJonessenior52
MaxWebermid-level43
KateWilliamssenior43
NickJacksonmid-level35
SophiaMooremid-level35
StevenMartinjunior27
MeganStevensjunior18
JackDavisjunior18
HelenBrownjunior010

Para classificar os desenvolvedores com base em sua experiência, incluímos o seguinte campo na declaração SELECT:

RANK() OVER (ORDER BY years_experience DESC)

Definimos a ordem após a cláusula ORDER BY, especificando a coluna a ser usada para classificação (years_experience) e a ordem (decrescente). Em seguida, classificamos os desenvolvedores com base nesta ordem.

Vemos que o desenvolvedor com 8 anos de experiência obtém a classificação 1, o desenvolvedor com 5 anos de experiência obtém a classificação 2, e os dois desenvolvedores com 4 anos de experiência ambos obtêm a classificação 3. Observe que a função RANK() deixa uma lacuna aqui, e os desenvolvedores seguintes recebem a classificação 5 (ou seja, a classificação 4 está faltando).

Agora você tem uma idéia de como a função RANK() funciona, incluindo como ela processa os mesmos valores na coluna usada para a classificação. Você pode encontrar mais casos de uso neste guia completo de linhas de classificação em SQL.

Agora, vamos passar a exemplos mais avançados.

Ranking dentro de diferentes grupos

Em nosso primeiro exemplo, classificamos todo o conjunto de resultados. Agora, digamos que queremos ter uma classificação separada para cada um dos níveis de senioridade (ou seja, júnior, médio e sénior).

Com a função RANK() em SQL, podemos fazer isso adicionando a palavra-chave PARTITION BY e especificando a coluna a ser usada para agrupar os registros. Aqui está nossa consulta SQL:

SELECT first_name, last_name, level, years_experience,
       RANK() OVER (PARTITION BY level ORDER BY years_experience    DESC)
FROM developers;

Na cláusula OVER(), primeiro definimos como agrupar os registros (usando a coluna level ) e depois definimos como ordenar os registros dentro destes grupos (com base nos anos de experiência, a partir do desenvolvedor mais experiente).

Aqui está a tabela resultante:

first_namelast_namelevelyears_experiencerank
StevenMartinjunior21
JackDavisjunior12
MeganStevensjunior12
HelenBrownjunior04
MaxWebermid-level41
NickJacksonmid-level32
SophiaMooremid-level32
AlexMillersenior81
JohnJonessenior52
KateWilliamssenior43

Observe que temos classificações separadas para os níveis júnior, intermediário e sênior. Ainda assim, o desenvolvedor mais experiente em cada grupo obtém a classificação 1, e os desenvolvedores com menos experiência obtêm classificações mais altas.

Observe também que enquanto Kate Williams e Max Weber têm os mesmos 4 anos de experiência, Max recebe a classificação 1 como a desenvolvedora de nível médio mais experiente, enquanto Kate recebe a classificação 3 como a desenvolvedora sênior menos experiente.

Agora que você sabe como funciona PARTITION BY, é hora de aprender sobre outras funções de ranking.

Outras Funções de Ranking em SQL

Para classificar as linhas em SQL, você também pode usar as funções DENSE_RANK() e ROW_NUMBER(). A diferença está na maneira como estas funções lidam com os mesmos valores.

Como aprendemos anteriormente, a função RANK() dá a mesma classificação aos registros com o mesmo valor e deixa uma lacuna para contabilizar estes registros. Em contraste, a função :

  • a função DENSE_RANK() não deixa uma lacuna;
  • a função ROW_NUMBER() classifica todos os registros de forma diferente, mesmo que os valores sejam os mesmos.

É mais fácil entender esta diferença com um exemplo. Portanto, vamos voltar ao nosso primeiro caso de uso, no qual classificamos todo o conjunto de resultados. Mas, desta vez, usaremos também DENSE_RANK() e ROW_NUMBER():

SELECT first_name, last_name, level, years_experience,
       RANK() OVER (ORDER BY years_experience DESC),
       DENSE_RANK() OVER (ORDER BY years_experience DESC),
       ROW_NUMBER() OVER (ORDER BY years_experience DESC)
FROM developers;
first_namelast_namelevelyears_experiencerankdense_rankrow_number
AlexMillersenior8111
JohnJonessenior5222
MaxWebermid-level4333
KateWilliamssenior4334
NickJacksonmid-level3545
SophiaMooremid-level3546
StevenMartinjunior2757
MeganStevensjunior1868
JackDavisjunior1869
HelenBrownjunior010710

Semelhante à função RANK(), a função DENSE_RANK() dá a mesma classificação aos desenvolvedores com os mesmos anos de experiência (por exemplo, classificação 3 para Kate Williams e Max Weber). Entretanto, a próxima posição na coluna dense_rank é 4, não deixando lacunas no ranking.

Por outro lado, a função ROW_NUMBER() atribui um número diferente a todos os desenvolvedores, incluindo os que têm os mesmos anos de experiência. Então, por que Max obtém a classificação 3 e Kate a classificação 4? É uma escolha arbitrária, e nunca se sabe qual dos registros com o mesmo valor receberá uma classificação mais alta.

Agora que você sabe a diferença entre as funções de classificação, você pode decidir qual delas é mais adequada para seus casos de uso. Se você não tiver certeza, veja mais exemplos das funções RANK(), DENSE_RANK(), e ROW_NUMBER() neste artigo geral.

Tempo para praticar as funções de ranking!

As funções de classificação estão entre as ferramentas mais comuns utilizadas pelos analistas de dados. Portanto, você deve se sentir confiante com o ranking em SQL. E a confiança vem com a prática.

Confira isto Funções de Janela (Window Functions) em SQL curso que inclui 218 exercícios interativos cobrindo funções de classificação, funções analíticas, computação de estatísticas avançadas com diferentes quadros de janela, etc. Você pode saber mais sobre o curso neste artigo.

E aqui está um bônus: este SQL Funções de Janela (Window Functions) em SQL Cheat Sheet de 2 páginas ajudará você a praticar a classificação e outras funções de janela.

Obrigado pela leitura, e feliz aprendizado!