Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
Se aplica a:SQL Server
Azure SQL Database
Instancia administrada de Azure SQL
Azure Synapse Analytics
Analytics Platform System (PDW)
Punto de conexión de SQL Analytics en Microsoft Fabric
Almacén en Microsoft Fabric
Base de datos SQL en Microsoft Fabric
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.
ROW_NUMBER y RANK son similares.
ROW_NUMBER enumera todas las filas secuencialmente (por ejemplo 1, 2, 3, 4, 5).
RANK proporciona el mismo valor numérico para valores equivalentes (por ejemplo 1, 2, 2, 4, 5).
Nota:
RANK es un valor temporal que se calcula cuando se ejecuta la consulta. Para persistir números en una tabla, consulte IDENTIDAD (Propiedad) y CREAR SECUENCIA.
Convenciones de sintaxis de Transact-SQL
Sintaxis
RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )
Argumentos
CAMBIO ( [ partition_by_clause ] order_by_clause )
El partition_by_clause divide el conjunto de resultados producido por la FROM cláusula 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.
order_by_clause es obligatorio. El <rows or range clause> de la OVER cláusula no puede especificarse para la RANK función. Para obtener más información, vea CLÁUSULA SELECT - OVER.
Tipos de retorno
bigint
Observaciones
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 SalesYTD valor, ambos están clasificados en el puesto uno. El vendedor con la siguiente posición más alta SalesYTD está en el tercer puesto, porque hay dos filas que están más arriba. Por lo tanto, la RANK función 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.
RANK sea no determinista. Para más información, vea Funciones deterministas y no deterministas.
Ejemplos
Los ejemplos de código de este artículo usan la base de datos de ejemplo de AdventureWorks2025 o AdventureWorksDW2025, que puede descargar de la página principal de Ejemplos de Microsoft SQL Server y proyectos de comunidad.
A. Filas de rango 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. En la ubicación 3, los productos 494 y 495 tienen la misma cantidad. Como están empatados, ambos están en el primer rango.
USE AdventureWorks2025;
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;
Este es el conjunto de resultados.
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
B. Ordena todas las filas de un conjunto de resultados
El siguiente ejemplo devuelve a los 10 mejores empleados ordenados por su salario. Como no se especifica una PARTITION BY cláusula, la RANK función se aplica a todas las filas del conjunto de resultados.
USE AdventureWorks2025;
GO
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;
Este es el conjunto de resultados.
BusinessEntityID Rate RankBySalary
---------------- --------------------- --------------------
1 125.50 1
2 63.4615 4
3 43.2692 11
4 29.8462 28
5 32.6923 22
6 32.6923 22
7 50.4808 6
8 40.8654 14
9 40.8654 14
10 42.4808 13
Ejemplos: Azure Synapse Analytics y Sistema de la plataforma de análisis (PDW)
C. Clasificar filas dentro de una partición
En el siguiente ejemplo se clasifican los representantes de ventas de cada territorio de ventas según sus ventas totales. Se crean particiones del conjunto de filas por SalesTerritoryGroup y se ordenan por SalesAmountQuota.
-- Uses AdventureWorks
SELECT e.LastName,
st.SalesTerritoryGroup,
SUM(sq.SalesAmountQuota) AS TotalSales,
RANK() OVER (PARTITION BY st.SalesTerritoryGroup ORDER BY SUM(sq.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 e.SalesPersonFlag = 1
AND st.SalesTerritoryGroup <> N'NA'
GROUP BY e.LastName, st.SalesTerritoryGroup;
Este es el conjunto de resultados.
LastName SalesTerritoryGroup TotalSales RankResult
------------------ -------------------- ------------ -----------
Pak Europe 10514000.00 1
Varkey Chudukatil Europe 5557000.00 2
Valdez Europe 2287000.00 3
Carson North America 12198000.00 1
Mitchell North America 11786000.00 2
Blythe North America 11162000.00 3
Reiter North America 8541000.00 4
Ito North America 7804000.00 5
Saraiva North America 7098000.00 6
Vargas North America 4365000.00 7
Campbell North America 4025000.00 8
Ansman-Wolfe North America 3551000.00 9
Mensa-Annan North America 2753000.00 10
Tsoflias Pacific 1687000.00 1