DENSE_RANK (Transact-SQL)
Aplica-se a: SQL Server Banco de Dados SQL do Azure Instância Gerenciada de SQL do Azure Azure Synapse Analytics PDW (Analytics Platform System) Ponto de extremidade de análise do SQL Warehouse no Microsoft Fabric
Esta função retorna a posição de cada linha dentro de uma partição do conjunto de resultados, sem nenhum intervalo nos valores de classificação. A classificação de uma linha é um mais o número de valores de classificação distintos que vêm antes da linha em questão.
Convenções de sintaxe de Transact-SQL
Sintaxe
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Argumentos
<partition_by_clause>
Primeiro divide o conjunto de resultados produzido pela cláusula FROM em partições, às quais a função DENSE_RANK
é então aplicada. Veja Cláusula OVER (Transact-SQL) para a sintaxe de PARTITION BY
.
<order_by_clause>
Determina a ordem na qual a função DENSE_RANK
é aplicada às linhas em uma partição.
Tipos de retorno
bigint
Comentários
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 SalesYTD, ambos terão um valor de classificação igual a um. O vendedor com o próximo SalesYTD mais alto terá um valor de classificação igual a dois. Isso excede o número de linhas distintas que vêm antes da linha em questão por um. Portanto, os números retornados pela função DENSE_RANK
não têm lacunas e sempre têm valores de classificação consecutivos.
A ordem de classificação usada para a consulta inteira determina a ordem das linhas no conjunto de resultados. Isso significa que uma linha classificada com o número um não precisa ser a primeira linha da partição.
DENSE_RANK
é não determinístico. Veja Funções determinísticas e não determinísticas para saber mais.
Exemplos
a. Classificando linhas dentro de uma partição
Este exemplo classifica os produtos em inventário pelos locais de inventário especificados, de acordo com suas quantidades. DENSE_RANK
particiona o conjunto de resultados por LocationID
e ordena logicamente o conjunto de resultados por Quantity
. Observe que 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 igual a 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
Veja a seguir 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. Classificando todas as linhas em um conjunto de resultados
Este exemplo retorna os dez primeiros funcionários classificados pelos respectivos salários. Devido à instrução SELECT
não ter especificado uma cláusula PARTITION BY
, a função DENSE_RANK
foi aplicada 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;
Veja a seguir 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
usadas na mesma consulta. Consulte cada função de classificação para obter exemplos específicos da 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;
Veja a seguir o conjunto de resultados.
Nome | LastName | Row Number | Rank | Dense Rank | Quartile | SalesYTD | PostalCode |
---|---|---|---|---|---|---|---|
Michael | 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 |
Davi | 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 e PDW (Analytics Platform System)
D: Classificando linhas dentro de uma partição
Este exemplo classifica os representantes de vendas em cada região de vendas de acordo com seu total de vendas. DENSE_RANK
particiona o conjunto de linhas por SalesTerritoryGroup
e classifica 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;
Veja a seguir 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
Confira também
RANK (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Funções de classificação (Transact-SQL)
Funções