Compartir a través de


RANGO (Transact-SQL)

Se aplica a:SQL ServerAzure SQL DatabaseInstancia administrada de Azure SQLAzure Synapse AnalyticsAnalytics Platform System (PDW)Punto de conexión de SQL Analytics en Microsoft FabricAlmacén en Microsoft FabricBase 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