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.

Ícone de vínculo de tópicoConvenções de 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 os valores DENSE_RANK são aplicados às linhas em uma partição. Um inteiro não pode representar uma coluna na <order_by_clause> que é usada em uma função de classificaçã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 SalesYTD, ambos serão classificados com o número um. O vendedor com o próximo SalesYTD mais alto será classificado com o número dois. É um a mais 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.

Exemplos

O exemplo a seguir retorna o DENSE_RANK da quantidade de produtos aos vários locais. Observe que ORDER BY na cláusula OVER ordena DENSE_RANK e ORDER BY da instrução SELECT ordena o conjunto de resultados.

USE AdventureWorks2008R2;
GO
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity, 
    DENSE_RANK() OVER (PARTITION BY i.LocationID ORDER BY i.Quantity)     AS DENSE_RANK
FROM Production.ProductInventory i 
    INNER JOIN Production.Product p 
        ON i.ProductID = p.ProductID
ORDER BY Name;
GO