ROW_NUMBER (Transact-SQL)

Devuelve el número secuencial de una fila de una partición de un conjunto de resultados, comenzando con 1 para la primera fila de cada partición.

Icono de vínculo a temasConvenciones de sintaxis de Transact-SQL

Sintaxis

ROW_NUMBER ( )     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 ROW_NUMBER. Para la sintaxis de PARTITION BY, vea OVER (cláusula de Transact-SQL).

  • <order_by_clause>
    Determina el orden en el que se asigna el valor ROW_NUMBER a las filas de una partición. Para obtener más información, vea ORDER BY (cláusula de Transact-SQL). Un entero no puede representar una columna cuando se usa la cláusula <order_by_clause> en una función de categoría.

Tipos de valor devueltos

bigint

Notas

La cláusula ORDER BY determina la secuencia en la que se asigna a las filas el ROW_NUMBER único correspondiente en una partición especificada.

Ejemplos

A. Devolver el número de fila de vendedor

El siguiente ejemplo devuelve el ROW_NUMBER para los vendedores de AdventureWorks, basado en las ventas anuales hasta la fecha.

SELECT FirstName, LastName, ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode 

FROM Sales.vSalesPerson

WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

B. Devolver un subconjunto de filas

En el ejemplo siguiente se devuelven filas con los números 50 a 60 inclusive en el orden de OrderDate.

USE AdventureWorks;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS 'RowNumber'
    FROM Sales.SalesOrderHeader 
) 
SELECT * 
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;

C. Usar ROW_NUMBER() con PARTITION

El ejemplo siguiente muestra cómo utilizar la función ROW_NUMBER con el argumento PARTITION BY.

SELECT FirstName, LastName, ROW_NUMBER() OVER(PARTITION BY PostalCode ORDER BY SalesYTD DESC) AS 'Row Number', SalesYTD, PostalCode 
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;