Ranking usando ROW_NUMBER()

Existem algumas coisas que não sabemos da existência, outras até conhecemos mas não temos idéia do dia que precisaremos delas. 

Há uns quatro anos eu precisava realizar uma consulta e retornar uma coluna com um seqüencial, numerando as linhas, algo bem simples assim:

 

cod_produto    des_produto                    sequencial

————– —————————— ————-

516E           Arroz                                1

03G            Azeitona                           2

98K            Salame                              3

514A           Tomate                            4

 

Como retornar um sequencial num comando Select simples? Eu não queria usar cursor, nem uma tabela auxiliar, nada disso, queria apenas um seqüencial, simples e objetivo. Enfim, procurei diversos meios e até hoje não soube uma forma simples de fazer isso no SQL Server 2000.

 

Com o SQL Server 2005 aquele bordão “Seus problemas acabaram” cabe perfeitamente nesse cenário. Existe uma função Row_Number() que  faz exatamente isso. Veja um exemplo:

 

SELECT

      cod_produto,

      des_produto,

      ROW_NUMBER() over (order by des_produto) sequencial

FROM

      tb_teste_produto

Como fica subtendido a consulta SQL irá retornar os campos da tabela mais um campo  seqüencial baseado na ordenação do nome do produto. 

Simples não é? 

Trabalhando com subconsultas é possível por exemplo atualizar todos os registros entre as linhas 60 e 80 de uma consulta… é o T-SQL dando suporte às nossas necessidades!

Se você tem outra solução para este cenário contribua deixando seu comentário :)

 

  1. salvadorscardua says:

    Esta é uma das 4 funções novas de Rankeamento que vieram com o SQL Server 2005. Lembro quando trabalhava com programação no Postgres em 2006 e tive esta mesma necessidade, não encontrei nada que me ajudasse com isso também na época.

  1. There are no trackbacks for this post yet.

Leave a Reply