Critérios de Desempate utilizando o ORDER BY – Parte 01

 

Resumo

 

A ordenação de um conjunto de linhas pode necessitar de um critério de desempate principalmente nos casos onde é necessário obter a posição relativa de cada linha no resultado final de um relatório. Neste artigo veremos alguns exemplos de como aplicar critérios de desempate utilizando a cláusula ORDER BY de uma instrução SELECT para identificar cada linha do resultado de acordo com a ordem desejada e o critério de desempate.

 

Introdução

 

Certos modelos permitem a geração de relatórios onde a ordenação dos dados é utilizada para destacar alguma linha do conjunto de linhas de uma tabela. Este relatório geralmente é utilizado quando se deseja visualizar um ranking das linhas de uma tabela, organizado de acordo com os atributos da tabela. Este ranking pode ser utilizado para auxiliar várias tarefas, como a premiação de um indivíduo de acordo com seu desempenho ou para obter a colocação de times em um campeonato.

 

Durante a definição de qual atributo deve ser aplicado para ordenar o conjunto de linhas deve-se definir também qual é o critério de desempate, isto é, como a colocação vai ser atribuída às linhas que possuírem o mesmo valor para o atributo que define a ordem. Esta regra de desempate geralmente é baseada em outro atributo da mesma tabela.

 

A ordenação dos resultados de uma instrução SELECT é facilmente obtida através da cláusula ORDER BY. Porém, nos casos onde os valores das colunas especificadas na cláusula ORDER BY se repetem,  é necessário aplicar um critério de desempate. Devemos utilizar os atributos da tabela para construir a regra de desempate que permite a geração correta do relatório.

 

Neste artigo vamos apresentar alguns exemplos de modelos onde a aplicação da regra de desempate pode ser implementada através da cláusula ORDER BY de uma instrução SELECT.

 

Escolhendo o ganhador

 

No primeiro exemplo vamos trabalhar com um modelo de jogos pela internet. Neste cenário vários jogadores participam individualmente de um jogo on-line onde o objetivo é completar certar tarefas e acumular pontos durante uma partida. O jogo possui um ganhador mensal apontado pelo jogador que acumulou mais pontos em alguma partida jogada no mês. Caso mais de um jogador possua a maior pontuação no final do mês deve-se aplicar o seguinte critério de desempate: o primeiro jogador que atingiu a pontuação máxima é o ganhador do mês.

 

A tabela que armazena os dados das partidas do jogo chama-se TB_JOGOS e suas linhas podem ser visualizadas na Tabela 1, onde temos quatro jogadores do mês de janeiro de 2005. Neste exemplo optou-se pela precisão de dias, mas nada impede que apliquemos o critério de desempate considerando as horas, minutos e segundos.

 

 

sql-25-07-2008pic13.JPG 

Tabela 1. Pontuação dos jogadores.

 

Para obter o ganhador mensal basta colocar a cláusula ORDER BY na instrução SELECT, especificando que desejamos primeiro ordenar as linhas da tabela pela coluna PONTOS_JOGADOR de forma decrescente e depois pela coluna DATA_PARTIDA de forma crescente. A instrução SELECT que traz o ganhador do mês é apresentada na Listagem 1.

 

sql-25-07-2008pic14.JPG
Listagem 1. Instrução que retorna a lista ordenada de participantes do mês.

 

Notem na instrução da Listagem 1 que obtemos todos os participantes do mês ordenados pela sua pontuação e, no caso de repetição da pontuação, aplicamos o critério de desempate através da ordenação decrescente da coluna DATA_PARTIDA, que é do tipo DATETIME do SQL Server. Os valores da coluna DATA_PARTIDA foram convertidos para o formato de data brasileiro.

 

A Tabela 2 apresenta o resultado da instrução contida na Listagem 1. O campeão do mês de janeiro de 2005 é o jogador C, pois ele fez os mesmos 10 pontos que o jogador D, mas um dia antes.

 

sql-25-07-2008pic15.JPG
Tabela 2. Jogadores ordenados.