Translate

sábado, 30 de agosto de 2014

Postgresql - Função dense_rank - Exibir a posição dos valores

Neste artigo, vamos apresentar 3 exemplos de como exibir as posições de acordo com valores de uma coluna, ou explicando de uma forma mais simples, como ranquear os valores de uma coluna.
Veja o script com os exemplos no github.

1º) Exemplo:

Queremos exibir a classificação dos atletas em uma corrida de acordo com o tempo gasto para completar a prova.
Para exibir a classificação vamos utilizar a tabela "tb_corrida" exibida abaixo:



Solução:

Para exibir a posição dos corredores utilizamos a sentença abaixo:

SELECT
DENSE_RANK() OVER(ORDER BY tempo_gasto
ASC) AS posicao,
inscricao,
tempo_gasto,
sexo
FROM tb_corrida 


Após a execução da sentença acima,  teremos o seguinte resultado:


Observações
  • Utilizamos DENSE_RANK sobre a coluna que queremos obter a classificação, neste caso "tempo_gasto". 
  • Observe que DENSE_RANK esta acompanhado de "OVER", e dentro do "OVER" vamos colocar a coluna que vamos utilizar para obter as posições e de que maneira queremos a classificação "ASC" - crescente (do valor mais baixo até o valor mais alto) ou "DESC" - decrescente (do valor mais alto até o valor mais baixo).
Repare que dois corredores ficaram empatados na 3ª posição. Através desse exemplo podemos perceber que a função dense_rank, leva em consideração os empates .

2º) Exemplo:

Queremos a classificação dos corredores separadas pelo sexo (masculino e feminino). Vamos utilizar a mesma tabela do primeiro exemplo,  "tb_corrida":






Solução:
Para exibir a posição dos corredores separadas por sexo utilizamos a sentença abaixo:

SELECT
DENSE_RANK() OVER(PARTITION BY sexo ORDER BY tempo_gasto
ASC) AS posicao,
inscricao,
tempo_gasto,
sexo
FROM tb_corrida



Após a execução da sentença acima,  teremos o seguinte resultado:


Repare que a única alteração que fizemos foi incluir "PARTITION BY" dentro do OVER
Após o PARTITION BY incluímos a coluna sexo, pois queremos que a classificação seja dividida por sexo.

3º) Exemplo:

Queremos a classificação dos vendedores em uma loja de acordo com o total das vendas.
Para exibir a classificação vamos utilizar a tabela "tb_vendas" exibida abaixo:




Solução:

Para exibir a classificação dos vendedores de acordo com o total das vendas executamos a sentença a seguir:

SELECT
codigo_vendedor,
SUM(valor),
DENSE_RANK() OVER(ORDER BY SUM(valor) DESC) AS posicao
FROM tb_vendas
GROUP BY codigo_vendedor


Após a execução da sentença acima,  teremos o seguinte resultado:



Repare que utilizamos a função da agrupamento SUM dentro do OVER para que fossem classificadas as somas do valores (e não os valores individualmente) e utilizamos o "GROUP BY" para agrupar as somas por código do vendedor. Além disso utizamos o "ORDER BY" com DESC para agrupar da soma com maior valor até a soma com menor valor.

A função  dense_rank pertence ao grupo de funções chamadas "window functions". Existem outras funções desse tipo, em breve publicaremos outras funções.

Deixe suas sugestões ou críticas.