Share via


RANK (Transact-SQL)

Devuelve el rango de cada fila en la partición de un conjunto de resultados. El rango de una fila es uno más el número de rangos anteriores a la fila en cuestión.

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

Sintaxis

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Argumentos

  • OVER ( [ partition_by_clause ] order_by_clause**)**
    partition_by_clause divide el conjunto de resultados generado por la cláusula FROM en particiones a las que se aplica la función. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como un único grupo. order_by_clause determina el orden de los datos antes de que se aplique la función. Se necesita order_by_clause. La <cláusula rows o range> de la cláusula OVER no se puede especificar para la función RANK. Para obtener más información, vea OVER (cláusula de Transact-SQL).

Tipos de valor devuelto

bigint

Comentarios

Si dos o más filas se enlazan en un rango, 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 vendedor con el siguiente valor más alto de SalesYTD recibe el rango tres, porque ya hay dos filas con un rango superior. Por tanto, la función RANK no siempre devuelve enteros consecutivos.

El criterio de ordenación empleado por la consulta global determina el orden en que aparecen las filas en el conjunto de resultados.

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
    ,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       3
496         Paint - Yellow         3            30       4
492         Paint - Black          3            17       5
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 RANK se aplica a todas las filas del conjunto de resultados.

USE AdventureWorks2012
SELECT TOP(10) BusinessEntityID, Rate, 
       RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (SELECT MAX(RateChangeDate) 
                        FROM HumanResources.EmployeePayHistory AS eph2
                        WHERE eph1.BusinessEntityID = eph2.BusinessEntityID)
ORDER BY BusinessEntityID;

El conjunto de resultados es el siguiente.

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
2                63.4615               4
3                43.2692               8
4                29.8462               19
5                32.6923               16
6                32.6923               16
7                50.4808               6
8                40.8654               10
9                40.8654               10
10               42.4808               9

Vea también

Referencia

DENSE_RANK (Transact-SQL)

ROW_NUMBER (Transact-SQL)

NTILE (Transact-SQL)

Funciones de categoría (Transact-SQL)

Funciones integradas (Transact-SQL)