Share via


DENSE_RANK (Transact-SQL)

Devuelve el rango de filas dentro de la partición de un conjunto de resultados, sin separaciones en la clasificación. El rango de una fila es uno más el número de rangos distintos anteriores a la fila en cuestión.

Icono de vínculo a temas Convenciones de sintaxis de Transact-SQL

Sintaxis

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

Argumentos

  • <partition_by_clause>
    Divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función DENSE_RANK. Para la sintaxis de PARTITION BY, vea OVER (cláusula de Transact-SQL).

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

Comentarios

Si dos o más filas se enlazan en un rango en la misma partición, cada fila enlazada recibe el mismo rango. Por ejemplo, si los dos mejores vendedores tienen el mismo valor de SalesYTD, los dos tienen el rango uno. El siguiente vendedor con mayor valor en SalesYTD tiene el rango número dos. Es uno más que el número de filas distintas anteriores a esta fila. Por tanto, los números devueltos por la función DENSE_RANK no tienen espacios y siempre tienen rangos consecutivos.

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

Ejemplos

A.Clasificar filas dentro de una partición

En el ejemplo siguiente se otorga un rango a los productos de inventario de las ubicaciones de inventario especificadas según sus cantidades. LocationID divide en particiones el conjunto de resultados y Quantity lo ordena lógicamente. Observe que los productos 494 y 495 tienen la misma cantidad. Como están enlazados, ambos tienen rango 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 el ejemplo siguiente se devuelven los diez primeros empleados clasificados por su salario. Como no se especifica ninguna cláusula PARTITION BY, la función DENSE_RANK se aplica 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

Vea también

Referencia

RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

Funciones de categoría (Transact-SQL)

Funciones integradas (Transact-SQL)