Classificação com Funções ROW_NUMBER, RANK, DENSE_RANK, NTILE

A partir do SQL Server 2005 possuímos um total de 4 funções de Ranking/classificação.

Para demonstrar e facilitar a compreensão destes conceitos, vamos utilizar o banco de Dados AdventureWorks que pode ser baixado do site Codeplex em : https://www.codeplex.com/MSFTDBProdSamples

Estas funções fazem com que problemas “clássicos” de SQL fiquem muito mais fáceis de se resolver.
As funções de Ranking retornam um valor de classificação para cada linha em uma partição. Todas as funções de Ranking são do tipo não-determinísticas, ou seja, as funções não-determinísticas podem retornar resultados diferentes cada vez que são chamadas com um conjunto específico de valores de entrada, mesmo se o estado do banco de dados que elas acessam permaneça o mesmo.

 

ROW_NUMBER () OVER ([ <partition_by_clause>] <order_by_clause>)
Retorna o número seqüencial de uma linha dentro de uma partição de um conjunto de resultados, começando em 1 para a primeira linha em cada partição.
 
RANK () OVER ([ <partition_by_clause>] <order_by_clause>) ([RANK () OVER <partition_by_clause>] <order_by_clause>)
Retorna (Rank) a posição de cada linha dentro da partição de um conjunto de resultados.
 
DENSE_RANK () OVER ([ <partition_by_clause>] <order_by_clause>) ([DENSE_RANK () OVER <partition_by_clause>] <order_by_clause>)
Retorna (Rank) a posição de linhas dentro da partição de um conjunto de resultados, sem quaisquer lacunas no ranking.
 
NTILE (integer_expression) OVER ([ <partition_by_clause>] <order_by_clause>) NTILE integer_expression () OVER ([ <partition_by_clause>] <order_by_clause>)
Distribui as linhas de uma partição ordenada em um determinado número de grupos.
 
Todas as definições acima e a sintaxe foram retiradas BOL.
O código abaixo explica o uso de todas as funções quatro juntos em uma consulta.USE AdventureWorks ; 
GO 
SELECT c.FirstName , c.LastName 
, ROW_NUMBER () OVER ( 
ORDER BY a.PostalCode ) AS 'Row Number' 
, RANK () OVER ( 
ORDER BY a.PostalCode ) AS 'Rank' 
, DENSE_RANK () OVER ( 
ORDER BY a.PostalCode ) AS 'Dense Rank' 
, NTILE ( 4 ) OVER ( 
ORDER BY a.PostalCode ) AS 'Quartile' 
, s.SalesYTD , a.PostalCode 
FROM Sales.SalesPerson s 
INNER JOIN Person.Contact c 
ON s.SalesPersonID = c.ContactID 
INNER JOIN Person.Address a 
ON a.AddressID = c.ContactID 
WHERE TerritoryID IS NOT NULL 
AND SalesYTD <> 0 ;

Veja a Query e seu resultado:

Classificação com Funções ROW_NUMBER, RANK, DENSE_RANK, NTILE

 

É isso ai pessoal.
Um Abraço
 
Participe do grupo de Usuarios Ms-Sql Server – Brasil