RANK (Transact-SQL)RANK (Transact-SQL)

APLICA-SE A: simSQL Server simBanco de Dados SQL do Azure simSQL Data Warehouse do Azure simParallel Data Warehouse APPLIES TO: yesSQL Server yesAzure SQL Database yesAzure SQL Data Warehouse yesParallel Data Warehouse

Retorna a classificação de cada linha na partição de um conjunto de resultados.Returns the rank of each row within the partition of a result set. A classificação de uma linha é um mais o número de classificações que vêm antes da linha em questão.The rank of a row is one plus the number of ranks that come before the row in question.

ROW_NUMBER e RANK são similares.ROW_NUMBER and RANK are similar. ROW_NUMBER numera todas as linhas em sequência (por exemplo 1, 2, 3, 4, 5).ROW_NUMBER numbers all rows sequentially (for example 1, 2, 3, 4, 5). RANK fornece o mesmo valor numérico para empates (por exemplo 1, 2, 2, 4, 5).RANK provides the same numeric value for ties (for example 1, 2, 2, 4, 5).

Observação

RANK é um valor temporário calculado quando a consulta é executada.RANK is a temporary value calculated when the query is run. Para persistir números em uma tabela, consulte Propriedade IDENTITY e SEQUENCE.To persist numbers in a table, see IDENTITY Property and SEQUENCE.

Ícone de link do tópico Convenções de sintaxe de Transact-SQLTopic link icon Transact-SQL Syntax Conventions

SintaxeSyntax

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )  

ArgumentosArguments

OVER ( [ partition_by_clause ] order_by_clause )OVER ( [ partition_by_clause ] order_by_clause)
partition_by_clause divide o conjunto de resultados produzido pela cláusula FROM em partições às quais a função é aplicada.partition_by_clause divides the result set produced by the FROM clause into partitions to which the function is applied. Se não for especificado, a função tratará todas as linhas do conjunto de resultados da consulta como um único grupo.If not specified, the function treats all rows of the query result set as a single group. order_by_clause determina a ordem dos dados antes de a função ser aplicada.order_by_clause determines the order of the data before the function is applied. order_by_clause é obrigatória.The order_by_clause is required. A <cláusula rows ou range/> da cláusula OVER não pode ser especificada para a função RANK.The <rows or range clause/> of the OVER clause cannot be specified for the RANK function. Para obter mais informações, consulte Cláusula OVER (Transact-SQL).For more information, see OVER Clause (Transact-SQL).

Tipos de retornoReturn Types

bigintbigint

RemarksRemarks

Se duas ou mais linhas empatarem em uma classificação, cada linha empatada receberá a mesma classificação.If two or more rows tie for a rank, each tied row receives the same rank. Por exemplo, se os dois melhores vendedores tiverem o mesmo valor SalesYTD, ambos serão classificados com o número um.For example, if the two top salespeople have the same SalesYTD value, they are both ranked one. O vendedor com o próximo SalesYTD maior será classificado com o número três, porque há duas linhas com classificação mais alta.The salesperson with the next highest SalesYTD is ranked number three, because there are two rows that are ranked higher. Portanto, a função RANK nem sempre retorna inteiros consecutivos.Therefore, the RANK function does not always return consecutive integers.

A ordem de classificação usada para a consulta inteira determina a ordem na qual as linhas aparecem em um conjunto de resultados.The sort order that is used for the whole query determines the order in which the rows appear in a result set.

RANK é não determinístico.RANK is nondeterministic. Para obter mais informações, veja Funções determinísticas e não determinísticas.For more information, see Deterministic and Nondeterministic Functions.

ExemplosExamples

A.A. Classificando linhas dentro de uma partiçãoRanking rows within a partition

O exemplo a seguir classifica os produtos em inventário nos locais de inventário especificados de acordo com suas quantidades.The following example ranks the products in inventory the specified inventory locations according to their quantities. O conjunto de resultados é particionado por LocationID e ordenado logicamente por Quantity.The result set is partitioned by LocationID and logically ordered by Quantity. Observe que produtos 494 e 495 têm a mesma quantidade.Notice that products 494 and 495 have the same quantity. Como eles estão vinculados, ambos são classificados como um.Because they are tied, they are both ranked one.

USE AdventureWorks2012;  
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;  
GO  

Aqui está o conjunto de resultados.Here is the result set.

  
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  
 (10 row(s) affected)  

B.B. Classificando todas as linhas em um conjunto de resultadosRanking all rows in a result set

O exemplo a seguir retorna os dez primeiros funcionários classificados pelo salário.The following example returns the top ten employees ranked by their salary. Como uma cláusula de PARTITION BY não foi especificada, a função RANK foi aplicada a todas as linhas no conjunto de resultados.Because a PARTITION BY clause was not specified, the RANK function was applied to all rows in the result set.

USE AdventureWorks2012  
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;  

Aqui está o conjunto de resultados.Here is the result set.

BusinessEntityID Rate                  RankBySalary  
---------------- --------------------- --------------------  
1                125.50                1  
2                63.4615               4  
3                43.2692               8  
4                29.8462               19  
5                32.6923               16  
6                32.6923               16  
7                50.4808               6  
8                40.8654               10  
9                40.8654               10  
10               42.4808               9  

Exemplos: Azure SQL Data WarehouseAzure SQL Data Warehouse e Parallel Data WarehouseParallel Data WarehouseExamples: Azure SQL Data WarehouseAzure SQL Data Warehouse and Parallel Data WarehouseParallel Data Warehouse

C: Classificando linhas dentro de uma partiçãoC: Ranking rows within a partition

O exemplo a seguir classifica os representantes de vendas em cada região de vendas de acordo com seu total de vendas.The following example ranks the sales representatives in each sales territory according to their total sales. O conjunto de linhas é particionado por SalesTerritoryGroup e ordenado por SalesAmountQuota.The rowset is partitioned by SalesTerritoryGroup and sorted by SalesAmountQuota.

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryRegion,  
    RANK() OVER (PARTITION BY SalesTerritoryRegion ORDER BY SUM(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 SalesPersonFlag = 1 AND SalesTerritoryRegion != N'NA'  
GROUP BY LastName, SalesTerritoryRegion;  

Aqui está o conjunto de resultados.Here is the result set.

LastName          TotalSales     SalesTerritoryGroup  RankResult
----------------  -------------  -------------------  --------
Tsoflias          1687000.0000   Australia            1
Saraiva           7098000.0000   Canada               1
Vargas            4365000.0000   Canada               2
Carson            12198000.0000  Central              1
Varkey Chudukatil 5557000.0000   France               1
Valdez            2287000.0000   Germany              1
Blythe            11162000.0000  Northeast            1
Campbell          4025000.0000   Northwest            1
Ansman-Wolfe      3551000.0000   Northwest            2
Mensa-Annan       2753000.0000   Northwest            3
Reiter            8541000.0000   Southeast            1
Mitchell          11786000.0000  Southwest            1
Ito               7804000.0000   Southwest            2
Pak               10514000.0000  United Kingdom       1

Consulte TambémSee Also

DENSE_RANK (Transact-SQL) DENSE_RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL) ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL) NTILE (Transact-SQL)
Funções de classificação (Transact-SQL) Ranking Functions (Transact-SQL)
Funções internas (Transact-SQL)Built-in Functions (Transact-SQL)