DENSE_RANK (Transact-SQL)DENSE_RANK (Transact-SQL)

APLICA-SE A: simSQL Server (a partir do 2008) simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Esta função retorna a posição de cada linha dentro de uma partição do conjunto de resultados, sem nenhum intervalo nos valores de classificação.This function returns the rank of each row within a result set partition, with no gaps in the ranking values. A classificação de uma linha é um mais o número de valores de classificação distintos que vêm antes da linha em questão.The rank of a specific row is one plus the number of distinct rank values that come before that specific row.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

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

ArgumentosArguments

<partition_by_clause><partition_by_clause>
Primeiro divide o conjunto de resultados produzido pela cláusula FROM em partições, às quais a função DENSE_RANK é então aplicada.First divides the result set produced by the FROM clause into partitions, and then the DENSE_RANK function is applied to each partition. Veja Cláusula OVER (Transact-SQL) para a sintaxe de PARTITION BY.See OVER Clause (Transact-SQL) for the PARTITION BY syntax.

<order_by_clause><order_by_clause>
Determina a ordem na qual a função DENSE_RANK é aplicada às linhas em uma partição.Determines the order in which the DENSE_RANK function applies to the rows in a partition.

Tipos de retornoReturn Types

bigintbigint

RemarksRemarks

Se duas ou mais linhas tiverem o mesmo valor de classificação na mesma partição, cada uma dessas linhas receberá a mesma classificação.If two or more rows have the same rank value in the same partition, each of those rows will receive the same rank. Por exemplo, se os dois melhores vendedores tiverem o mesmo valor de SalesYTD, ambos terão um valor de classificação igual a um.For example, if the two top salespeople have the same SalesYTD value, they will both have a rank value of one. O vendedor com o próximo SalesYTD mais alto terá um valor de classificação igual a dois.The salesperson with the next highest SalesYTD will have a rank value of two. Isso excede o número de linhas distintas que vêm antes da linha em questão por um.This exceeds the number of distinct rows that come before the row in question by one. Portanto, os números retornados pela função DENSE_RANK não têm lacunas e sempre têm valores de classificação consecutivos.Therefore, the numbers returned by the DENSE_RANK function do not have gaps, and always have consecutive rank values.

A ordem de classificação usada para a consulta inteira determina a ordem das linhas no conjunto de resultados.The sort order used for the whole query determines the order of the rows in the result set. Isso significa que uma linha classificada com o número um não precisa ser a primeira linha da partição.This implies that a row ranked number one does not have to be the first row in the partition.

DENSE_RANK é não determinístico.DENSE_RANK is nondeterministic. Veja Funções determinísticas e não determinísticas para saber mais.See Deterministic and Nondeterministic Functions for more information.

ExemplosExamples

A.A. Classificando linhas dentro de uma partiçãoRanking rows within a partition

Este exemplo classifica os produtos em inventário pelos locais de inventário especificados, de acordo com suas quantidades.This example ranks the products in inventory, by the specified inventory locations, according to their quantities. DENSE_RANK particiona o conjunto de resultados por LocationID e ordena logicamente o conjunto de resultados por Quantity.DENSE_RANK partitions the result set by LocationID and logically orders the result set by Quantity. Observe que produtos 494 e 495 têm a mesma quantidade.Notice that products 494 and 495 have the same quantity. Como ambos têm o mesmo valor de quantidade, ambos têm um valor de classificação igual a um.Because they both have the same quantity value, they both have a rank value of one.

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.Here is the result set.

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.B. Classificando todas as linhas em um conjunto de resultadosRanking all rows in a result set

Este exemplo retorna os dez primeiros funcionários classificados pelos respectivos salários.This example returns the top ten employees ranked by their salary. Devido à instrução SELECT não ter especificado uma cláusula PARTITION BY, a função DENSE_RANK foi aplicada a todas as linhas do conjunto de resultados.Because the SELECT statement did not specify a PARTITION BY clause, the DENSE_RANK function applied to all result set rows.

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.Here is the result set.

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  

C.C. Quatro funções de classificação usadas na mesma consultaFour ranking functions used in the same query

Este exemplo mostra as quatro funções de classificaçãoThis example shows the four ranking functions

usadas na mesma consulta.used in the same query. Consulte cada função de classificação para obter exemplos específicos da função.See each ranking function for function-specific examples.

USE AdventureWorks2012;  
GO  
SELECT p.FirstName, p.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 AS s   
    INNER JOIN Person.Person AS p   
        ON s.BusinessEntityID = p.BusinessEntityID  
    INNER JOIN Person.Address AS a   
        ON a.AddressID = p.BusinessEntityID  
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;  

Aqui está o conjunto de resultados.Here is the result set.

FirstNameFirstName LastNameLastName Row NumberRow Number RankRank Dense RankDense Rank QuartileQuartile SalesYTDSalesYTD PostalCodePostalCode
MichaelMichael BlytheBlythe 11 11 11 11 4557045.04594557045.0459 9802798027
LindaLinda MitchellMitchell 22 11 11 11 5200475.23135200475.2313 9802798027
JillianJillian CarsonCarson 33 11 11 11 3857163.63323857163.6332 9802798027
GarrettGarrett VargasVargas 44 11 11 11 1764938.98591764938.9859 9802798027
TsviTsvi ReiterReiter 55 11 11 22 2811012.71512811012.7151 9802798027
ShuShu ItoIto 66 66 22 22 3018725.48583018725.4858 9805598055
JoséJosé SaraivaSaraiva 77 66 22 22 3189356.24653189356.2465 9805598055
DavidDavid CampbellCampbell 88 66 22 33 3587378.42573587378.4257 9805598055
TeteTete Mensa-AnnanMensa-Annan 99 66 22 33 1931620.18351931620.1835 9805598055
LynnLynn TsofliasTsoflias 1010 66 22 33 1758385.9261758385.926 9805598055
RachelRachel ValdezValdez 1111 66 22 44 2241204.04242241204.0424 9805598055
JaeJae PakPak 1212 66 22 44 5015682.37525015682.3752 9805598055
RanjitRanjit Varkey ChudukatilVarkey Chudukatil 1313 66 22 44 3827950.2383827950.238 9805598055

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

D: Classificando linhas dentro de uma partiçãoD: Ranking rows within a partition

Este exemplo classifica os representantes de vendas em cada região de vendas de acordo com seu total de vendas.This example ranks the sales representatives in each sales territory according to their total sales. DENSE_RANK particiona o conjunto de linhas por SalesTerritoryGroup e classifica o conjunto de resultados por SalesAmountQuota.DENSE_RANK partitions the rowset by SalesTerritoryGroup, and sorts the result set by SalesAmountQuota.

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryGroup,  
    DENSE_RANK() OVER (PARTITION BY SalesTerritoryGroup ORDER BY SUM(SalesAmountQuota) DESC ) AS RankResult  
FROM dbo.DimEmployee AS e  
INNER JOIN dbo.FactSalesQuota AS sq ON e.EmployeeKey = sq.EmployeeKey  
INNER JOIN dbo.DimSalesTerritory AS st ON e.SalesTerritoryKey = st.SalesTerritoryKey  
WHERE SalesPersonFlag = 1 AND SalesTerritoryGroup != N'NA'  
GROUP BY LastName, SalesTerritoryGroup;  

Aqui está o conjunto de resultados.Here is the result set.

 LastName          TotalSales     SalesTerritoryGroup  RankResult  
----------------  -------------  -------------------  --------  
Pak               10514000.0000  Europe               1  
Varkey Chudukatil  5557000.0000  Europe               2  
Valdez             2287000.0000  Europe               3  
Carson            12198000.0000  North America        1  
Mitchell          11786000.0000  North America        2  
Blythe            11162000.0000  North America        3  
Reiter             8541000.0000  North America        4  
Ito                7804000.0000  North America        5  
Saraiva            7098000.0000  North America        6  
Vargas             4365000.0000  North America        7  
Campbell           4025000.0000  North America        8  
Ansman-Wolfe       3551000.0000  North America        9  
Mensa-Annan        2753000.0000  North America        10  
Tsoflias           1687000.0000  Pacific              1 

Consulte TambémSee Also

RANK (Transact-SQL) RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL) ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL) NTILE (Transact-SQL)
Funções de classificação (Transact-SQL) Ranking Functions (Transact-SQL)
FunçõesFunctions