Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
Aplica-se a:SQL Server
Base de Dados SQL do Azure
Instância Gerida do Azure SQL
Azure Synapse Analytics
Sistema de Plataforma de Análise (PDW)
Ponto de Extremidade de Análise SQL no Microsoft Fabric
Armazém no Microsoft Fabric
Base 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