Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analytics Platform System (PDW)
SQL Analytics-eindpunt in Microsoft Fabric
Magazijn in Microsoft Fabric
SQL-database in Microsoft Fabric
Deze functie geeft de rangorde van elke rij terug binnen een partitie van de resultaatverzameling, zonder gaten in de rangschikkingswaarden. De rang van een specifieke rij is één plus het aantal verschillende rangwaarden dat vóór die specifieke rij komt.
Transact-SQL syntaxis-conventies
Syntaxis
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Arguments
<partition_by_clause>
Eerst verdeelt de door de FROM-clausule geproduceerde resultaatset in partitities, waarna de DENSE_RANK functie op elke partitie wordt toegepast. Zie OVER-clausule (Transact-SQL) voor de syntaxis PARTITION BY .
<order_by_clause>
Bepaalt de volgorde waarin de DENSE_RANK functie van toepassing is op de rijen in een partitie.
Retourtypen
bigint
Opmerkingen
Als twee of meer rijen dezelfde rangwaarde hebben in dezelfde partitie, krijgt elk van die rijen dezelfde rang. Als bijvoorbeeld de twee topverkopers dezelfde SalesYTD-waarde hebben, hebben ze allebei een rangwaarde van één. De verkoper met de volgende hoogste SalesYTD heeft een rangwaarde van twee. Dit is één groter dan het aantal verschillende rijen die voor de betreffende rij komen. Daarom hebben de getallen die door de DENSE_RANK functie worden teruggegeven geen gaten en hebben ze altijd opeenvolgende rangwaarden.
De sorteervolgorde die voor de hele query wordt gebruikt, bepaalt de volgorde van de rijen in de resultaatset. Dit impliceert dat een rij met nummer één niet de eerste rij in de partitie hoeft te zijn.
DENSE_RANK is niet-deterministisch. Zie Deterministische en Niet-deterministische Functies voor meer informatie.
Voorbeelden
Eén. Rijen rangschikken binnen een partitie
Dit voorbeeld rangschikt de producten in de voorraad, op de gespecificeerde voorraadlocaties, op basis van hun hoeveelheden.
DENSE_RANK partitioneert de resultaatverzameling door LocationID en ordent logisch de resultaatverzameling door Quantity. Let op dat producten 494 en 495 dezelfde hoeveelheid hebben. Omdat ze allebei dezelfde hoeveelheidswaarde hebben, hebben ze allebei een rangwaarde van één.
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
Hier is het resultatenoverzicht.
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. Alle rijen in een resultaatset rangschikken
Dit voorbeeld geeft de top tien werknemers terug, gerangschikt op basis van hun salaris. Omdat de SELECT instructie geen PARTITION BY clausule specificeerde, gold de DENSE_RANK functie voor alle resultaatsetrijen.
USE AdventureWorks2022;
GO
SELECT TOP(10) BusinessEntityID, Rate,
DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;
Hier is het resultatenoverzicht.
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. Vier rangschikkingsfuncties die in dezelfde zoekopdracht worden gebruikt
Dit voorbeeld toont de vier rangschikkingsfuncties
gebruikt in dezelfde query. Zie elke rangschikkingsfunctie voor functie-specifieke voorbeelden.
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;
Hier is het resultatenoverzicht.
| Voornaam | Achternaam | Rijnummer | Rang | Dichte rang | Kwartiel | SalesYTD | Postcode |
|---|---|---|---|---|---|---|---|
| Michael | Blythe | 1 | 1 | 1 | 1 | 4557045.0459 | 98027 |
| Tsing | 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 |
Voorbeelden: Azure Synapse Analytics and Analytics Platform System (PDW)
D: Rangschikking van rijen binnen een partitie
Dit voorbeeld rangschikt de vertegenwoordigers in elk verkoopgebied op basis van hun totale verkopen.
DENSE_RANK deelt de rijverzameling op door SalesTerritoryGroup, en sorteert de resultaatverzameling door 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;
Hier is het resultatenoverzicht.
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
Zie ook
RANG (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Classificatiefuncties (Transact-SQL)
Functies