Partilhar via


DENSE_RANK (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

Esta função devolve a posição de cada linha dentro de uma partição do conjunto de resultados, sem lacunas nos valores de classificação. A classificação de uma linha específica é um mais o número de valores distintos de classificação que precedem essa linha específica.

Transact-SQL convenções de sintaxe

Sintaxe

DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )  

Arguments

<partition_by_clause>
Primeiro divide o conjunto de resultados produzido pela cláusula FROM em partições, e depois a DENSE_RANK função é aplicada a cada partição. Consulte a Cláusula OVER (Transact-SQL) para a PARTITION BY sintaxe.

<order_by_clause>
Determina a ordem em que a DENSE_RANK função se aplica às linhas numa partição.

Tipos de devolução

bigint

Observações

Se duas ou mais linhas tiverem o mesmo valor de classificação na mesma partição, cada uma dessas linhas receberá a mesma classificação. Por exemplo, se os dois melhores vendedores tiverem o mesmo valor de Vendas até ao ano, ambos terão um valor de classificação de um. O vendedor com o SalesTD seguinte mais alto terá um valor de classificação de dois. Isto excede em um o número de linhas distintas que vêm antes da linha em questão. Portanto, os números devolvidos pela DENSE_RANK função não têm lacunas e têm sempre valores de posto consecutivos.

A ordem de ordenação usada para toda a consulta determina a ordem das linhas no conjunto de resultados. Isto implica que uma linha classificada como número um não tem de ser a primeira linha da partição.

DENSE_RANK é não determinística. Consulte Funções Determinísticas e Não Determinísticas para mais informações.

Examples

A. Classificação das linhas dentro de uma partição

Este exemplo classifica os produtos no inventário, pelas localizações de inventário especificadas, de acordo com as suas quantidades. DENSE_RANK particiona o conjunto de resultados por LocationID e ordena logicamente o conjunto de resultados por Quantity. Repare que os produtos 494 e 495 têm a mesma quantidade. Como ambos têm o mesmo valor de quantidade, ambos têm um valor de classificação de um.

USE AdventureWorks2022;  
GO  
SELECT i.ProductID, p.Name, i.LocationID, i.Quantity  
    ,DENSE_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.

ProductID   Name                               LocationID Quantity Rank  
----------- ---------------------------------- ---------- -------- -----  
494         Paint - Silver                     3          49       1  
495         Paint - Blue                       3          49       1  
493         Paint - Red                        3          41       2  
496         Paint - Yellow                     3          30       3  
492         Paint - Black                      3          17       4  
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. Classificação de todas as linhas num conjunto de resultados

Este exemplo devolve os dez melhores funcionários classificados pelo seu salário. Como a SELECT instrução não especificava uma PARTITION BY cláusula, a DENSE_RANK função aplicava-se a todas as linhas do conjunto de resultados.

USE AdventureWorks2022;  
GO  
SELECT TOP(10) BusinessEntityID, Rate,   
       DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary  
FROM HumanResources.EmployeePayHistory;  

Aqui está o conjunto de resultados.

BusinessEntityID Rate                  RankBySalary  
---------------- --------------------- --------------------  
1                125.50                1  
25               84.1346               2  
273              72.1154               3  
2                63.4615               4  
234              60.0962               5  
263              50.4808               6  
7                50.4808               6  
234              48.5577               7  
285              48.101                8  
274              48.101                8  

C. Quatro funções de classificação usadas na mesma consulta

Este exemplo mostra as quatro funções de classificação

usado na mesma consulta. Consulte cada função de classificação para exemplos específicos de função.

USE AdventureWorks2022;  
GO  
SELECT p.FirstName, p.LastName  
    ,ROW_NUMBER() OVER (ORDER BY a.PostalCode) AS "Row Number"  
    ,RANK() OVER (ORDER BY a.PostalCode) AS Rank  
    ,DENSE_RANK() OVER (ORDER BY a.PostalCode) AS "Dense Rank"  
    ,NTILE(4) OVER (ORDER BY a.PostalCode) AS Quartile  
    ,s.SalesYTD  
    ,a.PostalCode  
FROM Sales.SalesPerson AS s   
    INNER JOIN Person.Person AS p   
        ON s.BusinessEntityID = p.BusinessEntityID  
    INNER JOIN Person.Address AS a   
        ON a.AddressID = p.BusinessEntityID  
WHERE TerritoryID IS NOT NULL AND SalesYTD <> 0;  

Aqui está o conjunto de resultados.

Primeiro nome Apelido Número da linha Classificação Posto Denso Quartil SalesYTD Código Postal
Miguel Blythe 1 1 1 1 4557045.0459 98027
Linda Mitchell 2 1 1 1 5200475.2313 98027
Jillian Carson 3 1 1 1 3857163.6332 98027
Garrett Vargas. 4 1 1 1 1764938.9859 98027
Tsvi Reiter 5 1 1 2 2811012.7151 98027
Shu Ito 6 6 2 2 3018725.4858 98055
José Saraiva 7 6 2 2 3189356.2465 98055
David Campbell 8 6 2 3 3587378.4257 98055
Tete Mensa-Annan 9 6 2 3 1931620.1835 98055
Lynn Tsoflias 10 6 2 3 1758385.926 98055
Rachel Valdez 11 6 2 4 2241204.0424 98055
Jae Pak 12 6 2 4 5015682.3752 98055
Ranjit Varkey Chudukatil 13 6 2 4 3827950.238 98055

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

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

Este exemplo classifica os representantes de vendas em cada território de vendas de acordo com o total de vendas. DENSE_RANK Particiona o conjunto de linhas por SalesTerritoryGroup, e ordena o conjunto de resultados por SalesAmountQuota.

-- Uses AdventureWorks  
  
SELECT LastName, SUM(SalesAmountQuota) AS TotalSales, SalesTerritoryGroup,  
    DENSE_RANK() OVER (PARTITION BY SalesTerritoryGroup 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 SalesTerritoryGroup != N'NA'  
GROUP BY LastName, SalesTerritoryGroup;  

Aqui está o conjunto de resultados.

 LastName          TotalSales     SalesTerritoryGroup  RankResult  
----------------  -------------  -------------------  --------  
Pak               10514000.0000  Europe               1  
Varkey Chudukatil  5557000.0000  Europe               2  
Valdez             2287000.0000  Europe               3  
Carson            12198000.0000  North America        1  
Mitchell          11786000.0000  North America        2  
Blythe            11162000.0000  North America        3  
Reiter             8541000.0000  North America        4  
Ito                7804000.0000  North America        5  
Saraiva            7098000.0000  North America        6  
Vargas             4365000.0000  North America        7  
Campbell           4025000.0000  North America        8  
Ansman-Wolfe       3551000.0000  North America        9  
Mensa-Annan        2753000.0000  North America        10  
Tsoflias           1687000.0000  Pacific              1 

Ver também

POSIÇÃO (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Classificação de funções (Transact-SQL)
Funções