ROW_NUMBER (Transact-SQL)
Retorna o número sequencial de uma linha em uma partição de um conjunto de resultados, iniciando em 1 para a primeira linha de cada partição.
Sintaxe
ROW_NUMBER ( ) OVER ( [ <partition_by_clause> ] <order_by_clause> )
Argumentos
<partition_by_clause>
Divide o conjunto de resultados produzido pela cláusula FROM nas partições às quais a função ROW_NUMBER é aplicada. Para obter a sintaxe de PARTITION BY, consulte Cláusula OVER (Transact-SQL).<order_by_clause>
Determina a ordem na qual o valor de ROW_NUMBER é atribuído às linhas de uma partição. Para obter mais informações, consulte Cláusula ORDER BY [Transact-SQL]. Um inteiro não pode representar uma coluna quando a <order_by_clause> é usada em uma função de classificação.
Tipos de retorno
bigint
Comentários
A cláusula ORDER BY determina a sequência na qual as linhas recebem seu ROW_NUMBER exclusivo em uma partição especificada.
Exemplos
A. Retornando o número de linha para vendedores
O exemplo a seguir retorna o ROW_NUMBER para os vendedores em AdventureWorks2008R2 com base nas vendas acumuladas no ano.
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. Retornando um subconjunto de linhas
O exemplo a seguir retorna linhas com números de 50 a 60 inclusive, na ordem de OrderDate.
USE AdventureWorks2008R2;
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. Usando ROW_NUMBER () com PARTITION
O exemplo a seguir mostra o uso da função ROW_NUMBER com o 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;