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 :)
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.