Not
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Gäller för:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Azure Synapse Analytics
Analysplattformssystem (PDW)
SQL-analysslutpunkt i Microsoft Fabric
Lager i Microsoft Fabric
SQL-databas i Microsoft Fabric
Denna funktion returnerar rangen för varje rad inom en resultatmängdspartition, utan luckor i rangvärdena. Rangen för en specifik rad är en plus antalet olika rangvärden som kommer före just den raden.
Transact-SQL syntaxkonventioner
Syntax
DENSE_RANK ( ) OVER ( [ <partition_by_clause> ] < order_by_clause > )
Arguments
<partition_by_clause>
Först delar den resultatmängden som produceras av FROM-klausulen i partitioner, och sedan DENSE_RANK tillämpas funktionen på varje partition. Se OVER-satsen (Transact-SQL) för syntaxen PARTITION BY .
<order_by_clause>
Bestämmer ordningen i vilken DENSE_RANK funktionen gäller för raderna i en partition.
Returtyper
bigint
Anmärkningar
Om två eller fler rader har samma rangvärde i samma partition, kommer varje rad att få samma rang. Till exempel, om de två främsta säljarna har samma SalesYTD-värde, kommer båda att ha ett rankningsvärde på ett. Säljaren med näst högst Försäljning hittills kommer att ha ett rankningsvärde på två. Detta överstiger antalet distinkta rader som kommer före den aktuella raden med en. Därför har de tal som funktionen returnerar DENSE_RANK inga luckor och har alltid på varandra följande rangvärden.
Sorteringsordningen som används för hela frågan bestämmer ordningen på raderna i resultatuppsättningen. Detta innebär att en rad med nummer ett inte behöver vara första raden i partitionen.
DENSE_RANK är nondeterministisk. Se Deterministiska och icke-deterministiska funktioner för mer information.
Examples
A. Rangordning av rader inom en partition
Detta exempel rangordnar produkterna i lager, efter angivna lagerplatser, baserat på deras kvantiteter.
DENSE_RANK delar upp resultatuppsättningen med LocationID och ordnar logiskt resultatmängden med Quantity. Observera att produkterna 494 och 495 har samma kvantitet. Eftersom de båda har samma kvantitetsvärde har de båda ett rangvärde på ett.
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
Här är resultatet.
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. Rangordna alla rader i ett resultatset
Detta exempel visar de tio bästa anställda rankade efter deras lön. Eftersom satsen SELECT inte specificerade en PARTITION BY klausul, DENSE_RANK tillämpades funktionen på alla resultatmängdsrader.
USE AdventureWorks2022;
GO
SELECT TOP(10) BusinessEntityID, Rate,
DENSE_RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory;
Här är resultatet.
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. Fyra rangordningsfunktioner som används i samma fråga
Detta exempel visar de fyra rangordningsfunktionerna
Används i samma fråga. Se varje rangordningsfunktion för funktionsspecifika exempel.
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;
Här är resultatet.
| Förnamn | Efternamn | Radnummer | Rangordning | Tät rang | Kvartil | Försäljning i år | Postnummer |
|---|---|---|---|---|---|---|---|
| Michael | Blythe | 1 | 1 | 1 | 1 | 4557045.0459 | 98027 |
| Karin | 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 |
Exempel: Azure Synapse Analytics and Analytics Platform System (PDW)
D: Rangordning av rader inom en partition
Detta exempel rangordnar säljrepresentanterna i varje försäljningsområde enligt deras totala försäljning.
DENSE_RANK delar radmängden med SalesTerritoryGroup, och sorterar resultatmängden med 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;
Här är resultatet.
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
Se även
RANG (Transact-SQL)
ROW_NUMBER (Transact-SQL)
NTILE (Transact-SQL)
Rankningsfunktioner (Transact-SQL)
Funktioner