Compartilhar via


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.

Aplica-se a: SQL Server (do SQL Server 2008 à versão atual), Banco de dados SQL do Windows Azure (da versão inicial até a versão atual).

Ícone de vínculo de tópico Convenções da sintaxe Transact-SQL

Sintaxe

ROW_NUMBER ( ) 
    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

Argumentos

  • PARTITION BY value_expression
    Divide o conjunto de resultados produzido pela cláusula FROM nas partições às quais a função ROW_NUMBER é aplicada. value_expression especifica a coluna pela qual o conjunto de resultados é particionado. Se PARTITION BY não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).

  • order_by_clause
    A cláusula ORDER BY determina a sequência na qual as linhas recebem seu ROW_NUMBER exclusivo em uma partição especificada. É obrigatório. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).

Tipos de retorno

bigint

Comentários gerais

Não há nenhuma garantia de que as linhas retornadas por uma consulta usando ROW_NUMBER() serão ordenadas exatamente da mesma maneira com cada execução a menos que as condições seguintes sejam verdadeiras.

  1. Os valores da coluna particionada sejam exclusivos.

  2. Os valores da coluna ORDER BY sejam exclusivos.

  3. As combinações de valores da coluna de partição e colunas ORDER BY sejam exclusivas.

ROW_NUMBER() é não determinística. Para obter mais informações, consulte Funções determinísticas e não determinísticas.

Exemplos

A.Retornando o número de linha para vendedores

O exemplo a seguir calcula um número de linha para os vendedores da Ciclos da Adventure Works com base em sua classificação de vendas no ano até a data.

USE AdventureWorks2012; 
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, 
    FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" 
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

Aqui está o conjunto de resultados.

Row FirstName    LastName               SalesYTD
--- -----------  ---------------------- -----------------
1   Linda        Mitchell               4251368.54
2   Jae          Pak                    4116871.22
3   Michael      Blythe                 3763178.17
4   Jillian      Carson                 3189418.36
5   Ranjit       Varkey Chudukatil      3121616.32
6   José         Saraiva                2604540.71
7   Shu          Ito                    2458535.61
8   Tsvi         Reiter                 2315185.61
9   Rachel       Valdez                 1827066.71
10  Tete         Mensa-Annan            1576562.19
11  David        Campbell               1573012.93
12  Garrett      Vargas                 1453719.46
13  Lynn         Tsoflias               1421810.92
14  Pamela       Ansman-Wolfe           1352577.13

B.Retornando um subconjunto de linhas

O exemplo a seguir calcula números de linha para todas as linhas da tabela SalesOrderHeader na ordem de OrderDate e retorna somente as linhas de 50 a 60.

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

C.Usando ROW_NUMBER () com PARTITION

O exemplo a seguir usa o argumento PARTITION BY para particionar o conjunto de resultados da consulta pela coluna TerritoryName. A cláusula ORDER BY especificada na cláusula OVER ordena as linhas em cada partição pela coluna SalesYTD. A cláusula ORDER BY na instrução SELECT ordena o conjunto de resultados inteiro da consulta por TerritoryName.

USE AdventureWorks2012;
GO
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;

Aqui está o conjunto de resultados.

FirstName  LastName             TerritoryName        SalesYTD      Row
---------  -------------------- ------------------   ------------  ---
Lynn       Tsoflias             Australia            1421810.92    1
José       Saraiva              Canada               2604540.71    1
Garrett    Vargas               Canada               1453719.46    2
Jillian    Carson               Central              3189418.36    1
Ranjit     Varkey Chudukatil    France               3121616.32    1
Rachel     Valdez               Germany              1827066.71    1
Michael    Blythe               Northeast            3763178.17    1
Tete       Mensa-Annan          Northwest            1576562.19    1
David      Campbell             Northwest            1573012.93    2
Pamela     Ansman-Wolfe         Northwest            1352577.13    3
Tsvi       Reiter               Southeast            2315185.61    1
Linda      Mitchell             Southwest            4251368.54    1
Shu        Ito                  Southwest            2458535.61    2
Jae        Pak                  United Kingdom       4116871.22    1

Consulte também

Referência

RANK (Transact-SQL)

DENSE_RANK (Transact-SQL)

NTILE (Transact-SQL)