ROW_NUMBER 창 함수
OVER 절의 ORDER BY 표현식을 기준으로 행 그룹 내에서 1부터 현재 행의 서수를 할당합니다. PARTITION BY 절(옵션)이 존재하면 각 행 그룹의 서수가 재설정됩니다. ORDER BY 표현식 값이 동일한 행이라고 해도 비확정적으로 다른 행 번호를 받습니다.
구문
ROW_NUMBER() OVER(
[ PARTITION BY expr_list ]
[ ORDER BY order_list ]
)
인수
- ( )
-
함수에 인수가 없지만 빈 괄호가 필요합니다.
- OVER
-
ROW_NUMBER 함수에 대한 창 함수 절입니다.
- PARTITION BY expr_list
-
선택 사항. 결과를 행 집합으로 나누는 하나 이상의 열 표현식입니다.
- ORDER BY order_list
-
선택 사항. 집합 내 행의 순서를 정의하는 하나 이상의 열 표현식입니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.
ORDER BY가 고유한 순서를 지정하지 않거나 생략되면 행의 순서는 비확정적입니다. 자세한 내용은 창 함수 데이터에 대한 고유 순서 지정 섹션을 참조하세요.
반환 타입
BIGINT
예시
다음 예제에서는 WINSALES
테이블을 사용합니다. WINSALES
테이블에 대한 설명은 창 함수 예제를 위한 샘플 테이블 섹션을 참조하세요.
다음 예제에서는 테이블을 QTY(오름차순)로 정렬한 다음 각 행에 행 번호를 할당합니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다.
SELECT salesid, sellerid, qty,
ROW_NUMBER() OVER(
ORDER BY qty ASC) AS row
FROM winsales
ORDER BY 4,1;
salesid sellerid qty row
---------+----------+-----+-----
30001 | 3 | 10 | 1
10001 | 1 | 10 | 2
10006 | 1 | 10 | 3
40005 | 4 | 10 | 4
30003 | 3 | 15 | 5
20001 | 2 | 20 | 6
20002 | 2 | 20 | 7
30004 | 3 | 20 | 8
10005 | 1 | 30 | 9
30007 | 3 | 30 | 10
40001 | 4 | 40 | 11
다음은 SELLERID를 기준으로 테이블을 분할하여 수량에 따라 각 파티션의 순서(오름차순)를 지정한 후 행 번호를 각 행에 할당하는 예입니다. 결과는 창 함수 결과를 적용한 후에 정렬됩니다.
SELECT salesid, sellerid, qty,
ROW_NUMBER() OVER(
PARTITION BY sellerid
ORDER BY qty ASC) AS row_by_seller
FROM winsales
ORDER BY 2,4;
salesid | sellerid | qty | row_by_seller
---------+----------+-----+-----
10001 | 1 | 10 | 1
10006 | 1 | 10 | 2
10005 | 1 | 30 | 3
20001 | 2 | 20 | 1
20002 | 2 | 20 | 2
30001 | 3 | 10 | 1
30003 | 3 | 15 | 2
30004 | 3 | 20 | 3
30007 | 3 | 30 | 4
40005 | 4 | 10 | 1
40001 | 4 | 40 | 2
다음 예제에서는 선택 절을 사용하지 않을 때의 결과를 보여줍니다.
SELECT salesid, sellerid, qty, ROW_NUMBER() OVER() AS row
FROM winsales
ORDER BY 4,1;
salesid sellerid qty row
---------+----------+-----+-----
30001 | 3 | 10 | 1
10001 | 1 | 10 | 2
10005 | 1 | 30 | 3
40001 | 4 | 40 | 4
10006 | 1 | 10 | 5
20001 | 2 | 20 | 6
40005 | 4 | 10 | 7
20002 | 2 | 20 | 8
30003 | 3 | 15 | 9
30004 | 3 | 20 | 10
30007 | 3 | 30 | 11