Compartilhar via


DENSE_RANK (Transact-SQL)

Retorna a classificação de linhas dentro da partição de um conjunto de resultados, sem qualquer lacuna na classificação. A classificação de uma linha é um mais o número de classificações distintas que vêm antes da linha em questão.

Aplica-se a: SQL Server (SQL Server 2008 até a versão atual), Banco de dados SQL do Windows Azure (da versão inicial até a versão atual).

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )

Argumentos

  • <partition_by_clause>
    Divide o conjunto de resultados produzido pela cláusula FROM nas partições às quais a função DENSE_RANK é aplicada. Para a sintaxe PARTITION BY, consulte Cláusula OVER (Transact-SQL).

  • <order_by_clause>
    Determina a ordem na qual a função DENSE_RANK é aplicada às linhas em uma partição.

Tipos de retorno

bigint

Comentários

Se duas ou mais linhas empatarem em uma classificação na mesma partição, cada linha empatada receberá a mesma classificação. Por exemplo, se os dois melhores vendedores tiverem o mesmo valor de SalesYTD, os dois serão classificados com o número um. O vendedor com o próximo SalesYTD mais alto será classificado com o número dois. Esse será um número maior que o número de linhas distintas que vêm antes dessa linha. Portanto, os números retornados pela função DENSE_RANK não têm lacunas e sempre têm classificações consecutivas.

A ordem de classificação usada para a consulta inteira determina a ordem na qual as linhas são exibidas em um resultado. Isso significa que uma linha classificada com o número um não precisa ser a primeira linha da partição.

DENSE_RANK é não determinística. Para obter mais informações, consulte Funções determinísticas e não determinísticas.

Exemplos

A.Classificando linhas dentro de uma partição

O exemplo a seguir classifica os produtos em inventário nos locais de inventário especificados de acordo com suas quantidades. O conjunto de resultados é particionado por LocationID e ordenado logicamente por Quantity. Observe que produtos 494 e 495 têm a mesma quantidade. Como eles estão vinculados, ambos são classificados como um.

USE AdventureWorks2012;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity
    ,DENSE_RANK() OVER 
    (PARTITION BY i.LocationID ORDER BY i.Quantity DESC) AS Rank
FROM Production.ProductInventory AS i 
INNER JOIN Production.Product AS p 
    ON i.ProductID = p.ProductID
WHERE i.LocationID BETWEEN 3 AND 4
ORDER BY i.LocationID;
GO

Aqui está o conjunto de resultados.

ProductID   Name                               LocationID Quantity Rank
----------- ---------------------------------- ---------- -------- -----
494         Paint - Silver                     3          49       1
495         Paint - Blue                       3          49       1
493         Paint - Red                        3          41       2
496         Paint - Yellow                     3          30       3
492         Paint - Black                      3          17       4
495         Paint - Blue                       4          35       1
496         Paint - Yellow                     4          25       2
493         Paint - Red                        4          24       3
492         Paint - Black                      4          14       4
494         Paint - Silver                     4          12       5

(10 row(s) affected)

B.Classificando todas as linhas em um conjunto de resultados

O exemplo a seguir retorna os dez primeiros funcionários classificados pelo salário. Como uma cláusula PARTITION BY não foi especificada, a função DENSE_RANK foi aplicada a todas as linhas no conjunto de resultados.

USE AdventureWorks2012;
GO
SELECT TOP(10) BusinessEntityID, Rate, 
       DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;

Aqui está o conjunto de resultados.

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
25               84.1346               2
273              72.1154               3
2                63.4615               4
234              60.0962               5
263              50.4808               6
7                50.4808               6
234              48.5577               7
285              48.101                8
274              48.101                8

Consulte também

Referência

RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

Funções de classificação (Transact-SQL)

Funções internas (Transact-SQL)