DENSE_RANK (Transact-SQL)

Se aplica a: SQL Server (todas las versiones admitidas) Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

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. 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.

Icono de vínculo de temaConvenciones de sintaxis de Transact-SQL

Sintaxis

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

Nota:

Para ver la sintaxis de Transact-SQL para SQL Server 2014 y versiones anteriores, consulte Versiones anteriores de la documentación.

Argumentos

<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. Vea Cláusula OVER (Transact-SQL) para obtener la sintaxis de PARTITION BY.

<order_by_clause>
Determina el orden en el que se aplica la función DENSE_RANK a las filas de una partición.

Tipos de valor devuelto

bigint

Observaciones

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. Por ejemplo, si los dos mejores vendedores tienen el mismo valor de SalesYTD, los dos tendrán un valor de rango de uno. El siguiente vendedor con mayor valor en SalesYTD tendrá un valor de rango de dos. Esto supera en uno el número de rangos distintos anteriores a la fila en cuestión. Por tanto, los números devueltos por la función DENSE_RANK no tienen espacios y siempre tienen valores de rango consecutivos.

El criterio de ordenación que usa la consulta global determina el orden de las filas en el conjunto de resultados. Esto implica que una fila que tiene el rango uno no tiene que ser la primera fila de la partición.

DENSE_RANK sea no determinista. Para más información, consulte Funciones deterministas y no deterministas.

Ejemplos

A. Clasificar filas dentro de una partición

En este ejemplo se clasifican los productos de inventario, por las ubicaciones de inventario especificadas, según sus cantidades. DENSE_RANK divide el conjunto de resultados por LocationID y ordena lógicamente el conjunto de resultados por Quantity. Observe que los productos 494 y 495 tienen la misma cantidad. Como los dos tienen el mismo valor de cantidad, los dos tienen un valor de rango de uno.

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:

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. Clasificar todas las filas de un conjunto de resultados

En este ejemplo se devuelven los diez primeros empleados clasificados por su salario. 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.

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:

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. Cuatro funciones de categoría usadas en la misma consulta

En este ejemplo se muestran las cuatro funciones de categoría

que se usaron en la misma consulta. Vea cada función de categoría para obtener ejemplos específicos de la función.

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:

Nombre Apellidos Row Number Rank Dense Rank Quartile SalesYTD PostalCode
Michael Blythe 1 1 1 1 4 557 045,0459 98027
Linda Mitchell 2 1 1 1 5 200 475,2313 98027
Jillian Carson 3 1 1 1 3 857 163,6332 98027
Garrett Vargas 4 1 1 1 1 764 938,9859 98027
Tsvi Reiter 5 1 1 2 2 811 012,7151 98027
Shu Ito 6 6 2 2 3 018 725,4858 98055
José Saraiva 7 6 2 2 3 189 356,2465 98055
David Campbell 8 6 2 3 3 587 378,4257 98055
Tete Mensa Annan 9 6 2 3 1 931 620,1835 98055
Lynn Tsoflias 10 6 2 3 1 758 385,926 98055
Rachel Valdez 11 6 2 4 2 241 204,0424 98055
Jae Pak 12 6 2 4 5 015 682,3752 98055
Ranjit Varkey Chudukatil 13 6 2 4 3 827 950,238 98055

Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)

D. Clasificar filas dentro de una partición

En este ejemplo se clasifican los representantes de ventas de cada territorio de ventas en función de sus ventas totales. DENSE_RANK divide el conjunto de filas por SalesTerritoryGroup y ordena el conjunto de resultados por 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:

 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én

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