다음을 통해 공유


RANK(Transact-SQL)

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed InstanceAzure Synapse Analytics분석 플랫폼 시스템(PDW)Microsoft Fabric의 SQL 분석 엔드포인트Microsoft Fabric의 웨어하우스Microsoft Fabric의 SQL 데이터베이스

결과 집합의 파티션 내에 있는 각 행의 순위를 반환합니다. 요청한 행의 순위는 해당 행 앞에 있는 행의 순위에 1을 더한 값입니다.

ROW_NUMBERRANK는 유사합니다. ROW_NUMBER는 모든 행의 번호를 순차적으로 지정합니다(예: 1, 2, 3, 4, 5). RANK는 순위 동률(예: 1, 2, 2, 4, 5)에 대해 동일한 숫자 값을 제공합니다.

참고

RANK는 쿼리를 실행할 때 계산되는 임시 값입니다. 테이블에서 숫자를 영속성으로 유지하려면 IDENTITY (Property)CREATE SEQUENCE를 참조하세요.

Transact-SQL 구문 표기 규칙

구문

RANK ( ) OVER ( [ partition_by_clause ] order_by_clause )

인수

오버 ([ partition_by_clause ] order_by_clause )

partition_by_clause는 절에 의해 FROM 생성된 결과 집합을 함수가 적용되는 파티션으로 나눕니다. 지정하지 않을 경우 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급됩니다.

order_by_clause는 함수를 적용하기 전에 데이터의 순서를 결정합니다. order_by_clause가 필요합니다. 절의 OVER 함수 <rows or range clause> 는 함수에 대해 RANK 명시할 수 없습니다. 자세한 내용은 SELECT - OVER 절을 참조하세요.

반환 형식

bigint

설명

하나의 순위에 둘 이상의 행이 결합되면 결합된 각 행은 동일한 순위를 갖게 됩니다. 예를 들어, 두 명의 최고 영업사원이 같은 SalesYTD 가치를 가지고 있다면 둘 다 1순위에 랭크됩니다. 다음으로 높은 SalesYTD 순위를 가진 영업사원은 3위로 분류되는데, 이는 두 줄이 더 높은 순위에 있기 때문입니다. 따라서 함수는 RANK 항상 연속된 정수를 반환하지 않습니다.

전체 쿼리에 사용되는 정렬 순서는 행이 결과 집합에 표시되는 순서를 결정합니다.

RANK는 비결정적입니다. 자세한 내용은 결정적 함수와 비결정적 함수를 참조하세요.

예제

이 문서의 코드 샘플은 AdventureWorks2025 또는 AdventureWorksDW2025 샘플 데이터베이스를 사용합니다. 이 데이터베이스는 Microsoft SQL Server 샘플 및 커뮤니티 프로젝트 홈페이지에서 다운로드할 수 있습니다.

A. 파티션 내 랭크 행

다음 예에서는 재고 수량을 기준으로 지정한 인벤토리 위치의 제품에 순위를 부여합니다. 결과 집합은 LocationID를 기준으로 분할되고 Quantity를 기준으로 논리적으로 정렬됩니다. 위치 3에서는 제품 494와 495가 동일한 수량을 가지고 있습니다. 동점이라 둘 다 랭킹 1위입니다.

USE AdventureWorks2025;
GO

SELECT i.ProductID,
       p.Name,
       i.LocationID,
       i.Quantity,
       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;

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

ProductID   Name                   LocationID   Quantity Rank
----------- ---------------------- ------------ -------- ----
494         Paint - Silver         3            49       1
495         Paint - Blue           3            49       1
493         Paint - Red            3            41       3
496         Paint - Yellow         3            30       4
492         Paint - Black          3            17       5
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

B. 결과 집합 내 모든 행을 순위 매기기

다음 예시는 급여 기준으로 상위 10명의 직원을 반환합니다. 절이 PARTITION BY 명시되지 않기 때문에, 함수는 RANK 결과 집합의 모든 행에 적용됩니다.

USE AdventureWorks2025;
GO

SELECT TOP (10) BusinessEntityID,
                Rate,
                RANK() OVER (ORDER BY Rate DESC) AS RankBySalary
FROM HumanResources.EmployeePayHistory AS eph1
WHERE RateChangeDate = (
    SELECT MAX(RateChangeDate)
    FROM HumanResources.EmployeePayHistory AS eph2
    WHERE eph1.BusinessEntityID = eph2.BusinessEntityID
)
ORDER BY BusinessEntityID;

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

BusinessEntityID Rate                  RankBySalary
---------------- --------------------- --------------------
1                125.50                1
2                63.4615               4
3                43.2692               11
4                29.8462               28
5                32.6923               22
6                32.6923               22
7                50.4808               6
8                40.8654               14
9                40.8654               14
10               42.4808               13

예: Azure Synapse Analytics 및 분석 플랫폼 시스템(PDW)

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

다음 예는 총 판매액에 따라 각 영업 지역에서 영업 담당자의 순위를 매깁니다. 행 집합은 SalesTerritoryGroup별로 분할되며 SalesAmountQuota를 기준으로 정렬됩니다.

-- Uses AdventureWorks
SELECT e.LastName,
       st.SalesTerritoryGroup,
       SUM(sq.SalesAmountQuota) AS TotalSales,
       RANK() OVER (PARTITION BY st.SalesTerritoryGroup ORDER BY SUM(sq.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 e.SalesPersonFlag = 1
      AND st.SalesTerritoryGroup <> N'NA'
GROUP BY e.LastName, st.SalesTerritoryGroup;

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

LastName           SalesTerritoryGroup  TotalSales   RankResult
------------------ -------------------- ------------ -----------
Pak                Europe               10514000.00  1
Varkey Chudukatil  Europe               5557000.00   2
Valdez             Europe               2287000.00   3
Carson             North America        12198000.00  1
Mitchell           North America        11786000.00  2
Blythe             North America        11162000.00  3
Reiter             North America        8541000.00   4
Ito                North America        7804000.00   5
Saraiva            North America        7098000.00   6
Vargas             North America        4365000.00   7
Campbell           North America        4025000.00   8
Ansman-Wolfe       North America        3551000.00   9
Mensa-Annan        North America        2753000.00   10
Tsoflias           Pacific              1687000.00   1