RANK (Transact-SQL)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

Devuelve el rango de cada fila en la partición de un conjunto de resultados.Returns the rank of each row within the partition of a result set. El rango de una fila es uno más el número de rangos anteriores a la fila en cuestión.The rank of a row is one plus the number of ranks that come before the row in question.

ROW_NUMBER y RANK son similares.ROW_NUMBER and RANK are similar. ROW_NUMBER enumera todas las filas secuencialmente (por ejemplo 1, 2, 3, 4, 5).ROW_NUMBER numbers all rows sequentially (for example 1, 2, 3, 4, 5). RANK proporciona el mismo valor numérico para valores equivalentes (por ejemplo 1, 2, 2, 4, 5).RANK provides the same numeric value for ties (for example 1, 2, 2, 4, 5).

Nota

RANK es un valor temporal que se calcula cuando se ejecuta la consulta.RANK is a temporary value calculated when the query is run. Para conservar los números de una tabla, vea Propiedad IDENTITY y SEQUENCE.To persist numbers in a table, see IDENTITY Property and SEQUENCE.

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

SintaxisSyntax

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )  

ArgumentosArguments

OVER ( [ partition_by_clause ] order_by_clause)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.partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. Si no se especifica, la función trata todas las filas del conjunto de resultados de la consulta como un único grupo.If not specified, the function treats all rows of the query result set as a single group. order_by_clause determina el orden de los datos antes de que se aplique la función.order_by_clause determines the order of the data before the function is applied. order_by_clause es obligatorio.The order_by_clause is required. La <cláusula rows o range> de la cláusula OVER no se puede especificar para la función RANK.The <rows or range clause/> of the OVER clause cannot be specified for the RANK function. Para más información, vea Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Tipos devueltosReturn Types

bigintbigint

NotasRemarks

Si dos o más filas se enlazan en un rango, cada fila enlazada recibe el mismo rango.If two or more rows tie for a rank, each tied row receives the same rank. Por ejemplo, si los dos mejores vendedores tienen el mismo valor de SalesYTD, los dos tienen el rango uno.For example, if the two top salespeople have the same SalesYTD value, they are both ranked one. El vendedor con el siguiente valor más alto de SalesYTD recibe el rango tres, porque ya hay dos filas con un rango superior.The salesperson with the next highest SalesYTD is ranked number three, because there are two rows that are ranked higher. Por tanto, la función RANK no siempre devuelve enteros consecutivos.Therefore, the RANK function does not always return consecutive integers.

El criterio de ordenación empleado por la consulta global determina el orden en que aparecen las filas en el conjunto de resultados.The sort order that is used for the whole query determines the order in which the rows appear in a result set.

RANK es no determinista.RANK is nondeterministic. Para obtener más información, consulte Deterministic and Nondeterministic Functions.For more information, see Deterministic and Nondeterministic Functions.

EjemplosExamples

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

En el ejemplo siguiente se otorga un rango a los productos de inventario de las ubicaciones de inventario especificadas según sus cantidades.The following example ranks the products in inventory the specified inventory locations according to their quantities. LocationID divide en particiones el conjunto de resultados y Quantity lo ordena lógicamente.The result set is partitioned by LocationID and logically ordered by Quantity. Observe que los productos 494 y 495 tienen la misma cantidad.Notice that products 494 and 495 have the same quantity. Como están enlazados, ambos tienen rango uno.Because they are tied, they are both ranked one.

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.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       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.B. Clasificar todas las filas de un conjunto de resultadosRanking all rows in a result set

En el ejemplo siguiente se devuelven los diez primeros empleados clasificados por su salario.The following example returns the top ten employees ranked by their salary. Como no se especifica ninguna cláusula PARTITION BY, la función RANK se aplica a todas las filas del conjunto de resultados.Because a PARTITION BY clause was not specified, the RANK function was applied to all rows in the result set.

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.Here is the result set.

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  

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

C: Clasificar filas dentro de una particiónC: Ranking rows within a partition

En el siguiente ejemplo se clasifican los representantes de ventas de cada territorio de ventas según sus ventas totales.The following example ranks the sales representatives in each sales territory according to their total sales. Se crean particiones del conjunto de filas por SalesTerritoryGroup y se ordenan por SalesAmountQuota.The rowset is partitioned by SalesTerritoryGroup and sorted by SalesAmountQuota.

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryRegion,  
    RANK() OVER (PARTITION BY SalesTerritoryRegion 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 SalesTerritoryRegion != N'NA'  
GROUP BY LastName, SalesTerritoryRegion;  

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

LastName          TotalSales     SalesTerritoryGroup  RankResult
----------------  -------------  -------------------  --------
Tsoflias          1687000.0000   Australia            1
Saraiva           7098000.0000   Canada               1
Vargas            4365000.0000   Canada               2
Carson            12198000.0000  Central              1
Varkey Chudukatil 5557000.0000   France               1
Valdez            2287000.0000   Germany              1
Blythe            11162000.0000  Northeast            1
Campbell          4025000.0000   Northwest            1
Ansman-Wolfe      3551000.0000   Northwest            2
Mensa-Annan       2753000.0000   Northwest            3
Reiter            8541000.0000   Southeast            1
Mitchell          11786000.0000  Southwest            1
Ito               7804000.0000   Southwest            2
Pak               10514000.0000  United Kingdom       1

Consulte tambiénSee Also

DENSE_RANK (Transact-SQL) DENSE_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)
Funciones integradas (Transact-SQL)Built-in Functions (Transact-SQL)