ROW_NUMBER(Transact-SQL)

결과 집합 파티션 내의 행 일련 번호를 반환합니다. 각 파티션의 첫 번째 행은 1로 시작합니다.

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

구문

ROW_NUMBER ( ) 
    OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )

인수

  • PARTITION BY value_expression
    FROM 절이 생성한 결과 집합을 ROW_NUMBER 함수가 적용되는 파티션으로 나눕니다. value_expression은 결과 집합을 분할하는 데 사용하는 열을 지정합니다. PARTITION BY를 지정하지 않을 경우 쿼리 결과 집합의 모든 행이 단일 그룹으로 취급됩니다. 자세한 내용은 OVER 절(Transact-SQL)을 참조하십시오.

  • order_by_clause
    ORDER BY 절은 지정된 파티션 내에서 행에 고유 ROW_NUMBER가 할당되는 순서를 결정합니다. 필수 항목입니다. 자세한 내용은 OVER 절(Transact-SQL)을 참조하십시오.

반환 형식

bigint

일반적인 주의

다음 조건이 충족되지 않으면 ROW_NUMBER()를 사용하여 쿼리에서 반환하는 행이 각 실행마다 정확히 동일하게 정렬된다는 보장이 없습니다.

  1. 분할된 열 값이 고유합니다.

  2. ORDER BY 열 값이 고유합니다.

  3. 파티션 열 및 ORDER BY 열 값의 조합이 고유합니다.

1.영업 사원의 행 번호 반환

다음 예에서는 연간 누계 판매 실적에 따라 Adventure Works Cycles의 영업 사원에 대한 행 번호를 계산합니다.

USE AdventureWorks2012; 
GO
SELECT ROW_NUMBER() OVER(ORDER BY SalesYTD DESC) AS Row, 
    FirstName, LastName, ROUND(SalesYTD,2,1) AS "Sales YTD" 
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0;

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

Row FirstName    LastName               SalesYTD
--- -----------  ---------------------- -----------------
1   Linda        Mitchell               4251368.54
2   Jae          Pak                    4116871.22
3   Michael      Blythe                 3763178.17
4   Jillian      Carson                 3189418.36
5   Ranjit       Varkey Chudukatil      3121616.32
6   José         Saraiva                2604540.71
7   Shu          Ito                    2458535.61
8   Tsvi         Reiter                 2315185.61
9   Rachel       Valdez                 1827066.71
10  Tete         Mensa-Annan            1576562.19
11  David        Campbell               1573012.93
12  Garrett      Vargas                 1453719.46
13  Lynn         Tsoflias               1421810.92
14  Pamela       Ansman-Wolfe           1352577.13

2.행의 하위 집합 반환

다음 예에서는 SalesOrderHeader 테이블에서 OrderDate를 기준으로 모든 행의 행 번호를 계산한 후 50에서 60까지의 행만 반환합니다.

USE AdventureWorks2012;
GO
WITH OrderedOrders AS
(
    SELECT SalesOrderID, OrderDate,
    ROW_NUMBER() OVER (ORDER BY OrderDate) AS RowNumber
    FROM Sales.SalesOrderHeader 
) 
SELECT SalesOrderID, OrderDate, RowNumber  
FROM OrderedOrders 
WHERE RowNumber BETWEEN 50 AND 60;

3.PARTITION에 ROW_NUMBER() 사용

다음 예에서는 PARTITION BY 인수를 사용하여 TerritoryName 열을 기준으로 쿼리 결과 집합을 분할합니다. OVER 절에 지정된 ORDER BY 절은 각 파티션의 행을 SalesYTD 열을 기준으로 정렬합니다. SELECT 문의 ORDER BY 절은 전체 쿼리 결과 집합을 TerritoryName을 기준으로 정렬합니다.

USE AdventureWorks2012;
GO
SELECT FirstName, LastName, TerritoryName, ROUND(SalesYTD,2,1),
ROW_NUMBER() OVER(PARTITION BY TerritoryName ORDER BY SalesYTD DESC) AS Row
FROM Sales.vSalesPerson
WHERE TerritoryName IS NOT NULL AND SalesYTD <> 0
ORDER BY TerritoryName;

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

FirstName  LastName             TerritoryName        SalesYTD      Row
---------  -------------------- ------------------   ------------  ---
Lynn       Tsoflias             Australia            1421810.92    1
José       Saraiva              Canada               2604540.71    1
Garrett    Vargas               Canada               1453719.46    2
Jillian    Carson               Central              3189418.36    1
Ranjit     Varkey Chudukatil    France               3121616.32    1
Rachel     Valdez               Germany              1827066.71    1
Michael    Blythe               Northeast            3763178.17    1
Tete       Mensa-Annan          Northwest            1576562.19    1
David      Campbell             Northwest            1573012.93    2
Pamela     Ansman-Wolfe         Northwest            1352577.13    3
Tsvi       Reiter               Southeast            2315185.61    1
Linda      Mitchell             Southwest            4251368.54    1
Shu        Ito                  Southwest            2458535.61    2
Jae        Pak                  United Kingdom       4116871.22    1

참고 항목

참조

RANK(Transact-SQL)

DENSE_RANK(Transact-SQL)

NTILE(Transact-SQL)