Compartir a través de


DENSE_RANK (Transact-SQL)

Devuelve el rango de filas dentro de la partición de un conjunto de resultados, sin ningún espacio 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 temasConvenciones 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 los valores de DENSE_RANK se aplican a las filas de una partición. Un entero no puede representar una columna en el <order_by_clause> que se usa en una función de categoría.

Tipos de valor devueltos

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

El siguiente ejemplo devuelve el valor DENSE_RANK de la cantidad de productos en varios almacenes. Observe que ORDER BY de la cláusula OVER ordena DENSE_RANK y ORDER BY de la instrucción SELECT ordena el 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