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

SE APLICA A: síSQL Server (a partir de 2008) síAzure SQL Database síAzure SQL Data Warehouse síAlmacenamiento de datos paralelos APPLIES TO: yesSQL Server (starting with 2008) yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Esta función devuelve el rango de cada fila dentro de una partición del conjunto de resultados, sin espacios en los valores de clasificación.This function returns the rank of each row within a result set partition, with no gaps in the ranking values. El rango de una fila específica es uno más el número de valores de rango distintos anteriores a esa fila específica.The rank of a specific row is one plus the number of distinct rank values that come before that specific row.

Icono de vínculo de tema Convenciones de sintaxis de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxisSyntax

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

ArgumentosArguments

<partition_by_clause><partition_by_clause>
Primero divide el conjunto de resultados generado por la cláusula FROM en particiones y después se aplica la función DENSE_RANK a cada partición.First divides the result set produced by the FROM clause into partitions, and then the DENSE_RANK function is applied to each partition. Vea Cláusula OVER (Transact-SQL) para obtener la sintaxis de PARTITION BY.See OVER Clause (Transact-SQL) for the PARTITION BY syntax.

<order_by_clause><order_by_clause>
Determina el orden en el que se aplica la función DENSE_RANK a las filas de una partición.Determines the order in which the DENSE_RANK function applies to the rows in a partition.

Tipos devueltosReturn Types

bigintbigint

NotasRemarks

Si dos o más filas tienen el mismo valor de rango en la misma partición, cada una de esas filas recibirá el mismo rango.If two or more rows have the same rank value in the same partition, each of those rows will receive the same rank. Por ejemplo, si los dos mejores vendedores tienen el mismo valor de SalesYTD, los dos tendrán un valor de rango de uno.For example, if the two top salespeople have the same SalesYTD value, they will both have a rank value of one. El siguiente vendedor con mayor valor en SalesYTD tendrá un valor de rango de dos.The salesperson with the next highest SalesYTD will have a rank value of two. Esto supera en uno el número de rangos distintos anteriores a la fila en cuestión.This exceeds the number of distinct rows that come before the row in question by one. Por tanto, los números devueltos por la función DENSE_RANK no tienen espacios y siempre tienen valores de rango consecutivos.Therefore, the numbers returned by the DENSE_RANK function do not have gaps, and always have consecutive rank values.

El criterio de ordenación que usa la consulta global determina el orden de las filas en el conjunto de resultados.The sort order used for the whole query determines the order of the rows in the result set. Esto implica que una fila que tiene el rango uno no tiene que ser la primera fila de la partición.This implies that a row ranked number one does not have to be the first row in the partition.

DENSE_RANK sea no determinista.DENSE_RANK is nondeterministic. Para más información, consulte Funciones deterministas y no deterministas.See Deterministic and Nondeterministic Functions for more information.

EjemplosExamples

A.A. Clasificar filas dentro de una particiónRanking rows within a partition

En este ejemplo se clasifican los productos de inventario, por las ubicaciones de inventario especificadas, según sus cantidades.This example ranks the products in inventory, by the specified inventory locations, according to their quantities. DENSE_RANK divide el conjunto de resultados por LocationID y ordena lógicamente el conjunto de resultados por Quantity.DENSE_RANK partitions the result set by LocationID and logically orders the result set by Quantity. Observe que los productos 494 y 495 tienen la misma cantidad.Notice that products 494 and 495 have the same quantity. Como los dos tienen el mismo valor de cantidad, los dos tienen un valor de rango de uno.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  

El conjunto de resultados es el siguiente.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. Clasificar todas las filas de un conjunto de resultadosRanking all rows in a result set

En este ejemplo se devuelven los diez primeros empleados clasificados por su salario.This example returns the top ten employees ranked by their salary. Como en la instrucción SELECT no se ha especificado una cláusula PARTITION BY, la función DENSE_RANK se ha aplicado a todas las filas del 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;  

El conjunto de resultados es el siguiente.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. Cuatro funciones de categoría usadas en la misma consultaFour ranking functions used in the same query

En este ejemplo se muestran las cuatro funciones de categoríaThis example shows the four ranking functions

que se usaron en la misma consulta.used in the same query. Vea cada función de categoría para obtener ejemplos específicos de la función.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;  

El conjunto de resultados es el siguiente.Here is the result set.

FirstNameFirstName LastNameLastName Row NumberRow Number RankRank Dense RankDense Rank QuartileQuartile SalesYTDSalesYTD PostalCodePostalCode
MichaelMichael BlytheBlythe 11 11 11 11 4 557 045,04594557045.0459 9802798027
LindaLinda MitchellMitchell 22 11 11 11 5 200 475,23135200475.2313 9802798027
JillianJillian CarsonCarson 33 11 11 11 3 857 163,63323857163.6332 9802798027
GarrettGarrett VargasVargas 44 11 11 11 1 764 938,98591764938.9859 9802798027
TsviTsvi ReiterReiter 55 11 11 22 2 811 012,71512811012.7151 9802798027
ShuShu ItoIto 66 66 22 22 3 018 725,48583018725.4858 9805598055
JoséJosé SaraivaSaraiva 77 66 22 22 3 189 356,24653189356.2465 9805598055
DavidDavid CampbellCampbell 88 66 22 33 3 587 378,42573587378.4257 9805598055
TeteTete Mensa AnnanMensa-Annan 99 66 22 33 1 931 620,18351931620.1835 9805598055
LynnLynn TsofliasTsoflias 1010 66 22 33 1 758 385,9261758385.926 9805598055
RachelRachel ValdezValdez 1111 66 22 44 2 241 204,04242241204.0424 9805598055
JaeJae PakPak 1212 66 22 44 5 015 682,37525015682.3752 9805598055
RanjitRanjit Varkey ChudukatilVarkey Chudukatil 1313 66 22 44 3 827 950,2383827950.238 9805598055

Ejemplos: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse y Almacenamiento de datos paralelosParallel Data WarehouseExamples: Almacenamiento de datos SQL de AzureAzure SQL Data Warehouse and Almacenamiento de datos paralelosParallel Data Warehouse

D: Clasificar filas dentro de una particiónD: Ranking rows within a partition

En este ejemplo se clasifican los representantes de ventas de cada territorio de ventas en función de sus ventas totales.This example ranks the sales representatives in each sales territory according to their total sales. DENSE_RANK divide el conjunto de filas por SalesTerritoryGroup y ordena el 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;  

El conjunto de resultados es el siguiente.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 tambiénSee Also

RANK (Transact-SQL) RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL) ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL) NTILE (Transact-SQL)
Funciones de categoría (Transact-SQL) Ranking Functions (Transact-SQL)
FuncionesFunctions