DENSE_RANK(Transact-SQL)

결과 집합 파티션 내 행의 순위를 순위 간격 없이 반환합니다. 행의 순위는 바로 앞 행의 순위에 1을 더한 것입니다.

항목 링크 아이콘 Transact-SQL 구문 표기 규칙

구문

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

인수

  • <partition_by_clause>
    FROM 절이 생성한 결과 집합을 DENSE_RANK 함수가 적용되는 파티션으로 나눕니다. PARTITION BY 구문은 OVER 절(Transact-SQL)을 참조하십시오.

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

반환 형식

bigint

주의

같은 파티션에서 한 순위에 두 개 이상의 행이 연결된 경우 연결된 각 행에는 같은 순위가 지정됩니다. 예를 들어 성과가 가장 좋은 두 명의 판매 직원이 같은 SalesYTD 값을 갖는 경우 둘 다 1로 순위가 지정됩니다. 다음으로 높은 SalesYTD 값을 갖는 판매 직원이 순위 2로 지정됩니다. 이는 해당 행 앞에 오는 개별 행의 수보다 하나 더 큰 값입니다. 따라서 DENSE_RANK 함수가 반환하는 수는 간격 없이 항상 연속적인 순위를 갖게 됩니다.

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

1.파티션 내의 행 순위 지정

다음 예에서는 재고 수량을 기준으로 지정한 인벤토리 위치의 제품에 순위를 부여합니다. 결과 집합은 LocationID를 기준으로 분할되고 Quantity를 기준으로 논리적으로 정렬됩니다. 제품 494와 495는 수량이 동일합니다. 두 제품은 서로 연결되어 있으므로 동일하게 순위 1이 부여됩니다.

USE AdventureWorks2012;
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)

2.결과 집합의 모든 행 순위 지정

다음 예제에서는 연봉이 상위 10위권에 들어가는 직원을 반환합니다. PARTITION BY 절을 지정하지 않았으므로 결과 집합의 모든 행에 DENSE_RANK 함수가 적용되었습니다.

USE AdventureWorks2012;
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

참고 항목

참조

RANK(Transact-SQL)

ROW_NUMBER(Transact-SQL)

NTILE(Transact-SQL)

순위 함수(Transact-SQL)

기본 제공 함수(Transact-SQL)