Partilhar via


PATENTE (Transact-SQL)

Aplica-se a:SQL ServerBase de Dados SQL do AzureInstância Gerida do Azure SQLAzure Synapse AnalyticsSistema de Plataforma de Análise (PDW)Ponto de Extremidade de Análise SQL no Microsoft FabricArmazém no Microsoft FabricBase de Dados SQL no Microsoft Fabric

Devolve o posto de cada linha dentro da partição de um conjunto de resultados. A classificação de uma linha é um mais o número de classificações que surgem antes da linha em questão.

ROW_NUMBER e RANK são semelhantes. ROW_NUMBER numera todas as linhas sequencialmente (por exemplo, 1, 2, 3, 4, 5). RANK fornece o mesmo valor numérico para empates (por exemplo, 1, 2, 2, 4, 5).

Observação

RANK é um valor temporário calculado quando a consulta é executada. Para persistir números numa tabela, veja IDENTIDADE (Propriedade) e CRIAR SEQUÊNCIA.

Transact-SQL convenções de sintaxe

Sintaxe

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

Arguments

TERMINADO ( [ partition_by_clause ] order_by_clause )

O partition_by_clause divide o conjunto de resultados produzido pela FROM cláusula em partições às quais a função é aplicada. Se não for especificada, a função trata todas as linhas do conjunto de resultados da consulta como um único grupo.

O order_by_clause determina a ordem dos dados antes que a função seja aplicada. O order_by_clause é obrigatório. O <rows or range clause> de da OVER cláusula não pode ser especificado para a RANK função. Para obter mais informações, consulte Cláusula SELECT - OVER.

Tipos de devolução

bigint

Observações

Se duas ou mais linhas empatarem numa posição, cada linha empatada recebe a mesma classificação. Por exemplo, se os dois melhores vendedores tiverem o mesmo SalesYTD valor, ambos estão classificados em primeiro lugar. O vendedor com o próximo valor mais alto SalesYTD está classificado em terceiro lugar, porque há duas linhas que estão classificadas acima. Portanto, a RANK função nem sempre devolve inteiros consecutivos.

A ordem de ordenação usada para toda a consulta determina a ordem em que as linhas aparecem num conjunto de resultados.

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

Examples

Os exemplos de código neste artigo usam o banco de dados de exemplo AdventureWorks2025 ou AdventureWorksDW2025, que pode ser descarregado da página inicial de Exemplos e Projetos da Comunidade do Microsoft SQL Server.

A. Linhas de classificação dentro de uma partição

O exemplo seguinte classifica os produtos em inventário nas localizações de inventário especificadas de acordo com as suas quantidades. O conjunto de resultados é particionado por LocationID e ordenado logicamente por Quantity. Na localização 3, os produtos 494 e 495 têm a mesma quantidade. Como estão empatados, ambos estão classificados em um lugar.

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;

Aqui está o 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. Ordenar todas as linhas de um conjunto de resultados

O exemplo seguinte devolve os 10 melhores funcionários ordenados pelo seu salário. Como uma PARTITION BY cláusula não é especificada, a RANK função é aplicada a todas as linhas do 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;

Aqui está o 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

Exemplos: Azure Synapse Analytics and Analytics Platform System (PDW)

C: Classificação das linhas dentro de uma partição

O exemplo seguinte classifica os representantes de vendas em cada território de venda de acordo com o total de vendas. O conjunto de linhas é particionado por SalesTerritoryGroup e ordenado 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;

Aqui está o 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