DENSE_RANK(Transact-SQL)

적용 대상:SQL 서버Azure SQL DatabaseAzure SQL Managed InstanceAzure Synapse AnalyticsMicrosoft Fabric 의 SQL 분석 엔드포인트Microsoft Fabric 의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

이 함수는 순위 값에 격차가 없이 결과 집합 파티션 내에서 각 행의 순위를 반환합니다. 특정 행의 순위는 바로 앞 해당 특정 행의 순위 값에 1을 더한 수입니다.

Transact-SQL 구문 표기 규칙

구문

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

인수

<partition_by_clause>

먼저 FROM 절이 생성한 결과 집합을 파티션으로 나눈 다음, DENSE_RANK함수를 각 파티션에 적용합니다. 구문은 PARTITION BY을 참조하세요.

<order_by_clause>

파티션의 행에 DENSE_RANK 함수가 적용되는 순서를 결정합니다.

반환 형식

bigint

설명

같은 파티션에서 두 개 이상의 행이 동일한 랭크 값을 가지면, 각 행은 동일한 랭크를 가집니다. 예를 들어, 상위 두 영업사원이 같은 SalesYTD 값을 가진다면, 둘 다 순위 가치가 1입니다. 다음으로 높은 SalesYTD 점수를 가진 영업사원의 랭크 가치는 2입니다. 이 랭크 값은 해당 행 앞에 있는 서로 다른 행 수를 1배 초과합니다. 따라서 함수가 DENSE_RANK 반환하는 숫자들은 공백이 없고 항상 연속된 순위 값을 가집니다.

전체 쿼리에 사용되는 정렬 순서는 결과 집합의 행의 순서를 결정합니다. 이 순서는 1번 행이 반드시 파티션의 첫 번째 행일 필요는 없음을 의미합니다.

DENSE_RANK는 비결정적입니다. 자세한 내용은 Deterministic and Nondeterministic Functions을 참조하세요.

윈도우 함수 성능 튜닝 지침은 OVER() 성능 고려사항을 참조하세요.

예제

A. 파티션 내 랭크 행

이 예에서는 재고 수량을 기준으로 지정한 인벤토리 위치의 제품에 순위를 부여합니다. DENSE_RANK는 LocationID로 결과 집합을 분할하고 Quantity로 논리적으로 결과 집합의 순서를 정합니다. 제품 494와 495는 동일한 수량을 가지고 있습니다. 모두가 동일한 수량 값을 갖기 때문에 모두가 1의 순위 값을 갖습니다.

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  

결과 집합은 다음과 같습니다.

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. 결과 집합 내 모든 행을 순위 매기기

이 예제에서는 연봉이 상위 10위권에 들어가는 직원을 반환합니다. 문장이 SELECT 절을 PARTITION BY 명시하지 않기 때문에, 이 함수는 DENSE_RANK 모든 결과 집합 행에 적용됩니다.

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

결과 집합은 다음과 같습니다.

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. 동일한 쿼리에 사용된 4가지 순위 함수

이 예에서는 4가지 순위 함수를 보여줌

같은 쿼리에서 사용됩니다. 함수별 예에 대한 자세한 내용은 각 순위 함수를 참조하십시오.

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;  

결과 집합은 다음과 같습니다.

FirstName LastName 행 번호 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
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

예제: Azure Synapse Analytics

D: 파티션 내의 행 순위 지정

이 예는 총 판매액에 따라 각 영업 지역에서 영업 담당자의 순위를 매깁니다. DENSE_RANK는 SalesTerritoryGroup으로 행 집합을 분할하고 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;  

결과 집합은 다음과 같습니다.

 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