- 카테고리:
윈도우 함수 구문 및 사용법 (순위 지정)
NTH_VALUE¶
정렬된 값 그룹 내의 n번째 값(최대 1000)을 반환합니다.
- 참고 항목:
구문¶
NTH_VALUE( <expr> , <n> ) [ FROM { FIRST | LAST } ] [ { IGNORE | RESPECT } NULLS ]
OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
자세한 window_frame
구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.
인자¶
n
이것은 N번째 값을 찾을 때 사용할 N의 값을 지정합니다.
expr
반환 값을 결정하는 식입니다.
expr1
행을 분할하는 데 사용하는 식입니다. 단일 식 또는 쉼표로 구분된 식 목록을 지정할 수 있습니다. 예:
PARTITION BY column_1, column_2
expr2
행을 정렬하는 데 사용하는 식입니다. 단일 식 또는 쉼표로 구분된 식 목록을 지정할 수 있습니다. 예:
ORDER BY column_3, column_4
FROM { FIRST | LAST }
expr
에 NULL 값이 포함된 경우 NULL 값을 무시할지 또는 적용할지 여부입니다.FROM FIRST
는 정렬된 목록의 시작 부분부터 시작하여 앞으로 이동합니다.FROM LAST
는 정렬된 목록의 끝에서 시작하여 뒤로 이동합니다.
기본값:
FROM FIRST
{ IGNORE | RESPECT } NULLS
expr
에 NULL 값이 포함된 경우 NULL 값을 무시할지 또는 적용할지 여부입니다.IGNORE NULLS
식에서 NULL 값을 건너뜁니다.RESPECT NULLS
는 식의 n번째 값인 경우 NULL 값을 반환합니다.
기본값:
RESPECT NULLS
사용법 노트¶
입력 값
n
은 1000보다 클 수 없습니다.
이 함수는 순위와 관련된 함수이므로 윈도우를 지정해야 합니다. 윈도우 절은 다음 하위 절로 구성됩니다.
PARTITION BY expr1
하위 절(선택 사항).ORDER BY expr2
하위 절(필수 사항). 추가로 지원되는 정렬 옵션(정렬 순서, NULL 값의 순서 등)에 대한 자세한 내용은 동일한 규칙을 따르는 ORDER BY 절에 대한 설명서를 참조하십시오.window_frame
하위 절(선택 사항).
윈도우에서 행의 순서와 그에 따른 쿼리 결과는 ORDER BY 절의 키가 각 행을 고유하게 만드는 경우에만 완전히 결정적입니다. 다음 예를 살펴보겠습니다.
... OVER (PARTITION BY p ORDER BY o COLLATE 'lower') ...
똑같거나 대/소문자를 구분하지 않는 비교에서 똑같은
o
열의 값이 파티션에 포함된 경우 쿼리 결과가 달라질 수 있습니다.OVER 절 내의 ORDER BY 절은 전체 쿼리 출력의 행 순서가 아니라 윈도우 내의 행 순서만 제어합니다. 출력 순서를 제어하려면 쿼리의 가장 바깥쪽 수준에서 별도의 ORDER BY 절을 사용하십시오.
선택적
window_frame
(누적 또는 슬라이딩)은 함수가 계산되는 윈도우 내의 행 하위 세트를 지정합니다.window_frame
이 지정되지 않은 경우, 기본값은 전체 윈도우입니다.ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
이는 윈도우 프레임에 대해 다음 기본값을 지정하는 ANSI 표준과는 다릅니다.
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
구문, 사용법 노트, 예를 포함하여 윈도우 프레임에 대한 자세한 내용은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.
예¶
SELECT column1,
column2,
NTH_VALUE(column2, 2) OVER (PARTITION BY column1 ORDER BY column2) AS column2_2nd
FROM VALUES
(1, 10), (1, 11), (1, 12),
(2, 20), (2, 21), (2, 22);
+---------+---------+-------------+
| COLUMN1 | COLUMN2 | COLUMN2_2ND |
|---------+---------+-------------|
| 1 | 10 | 11 |
| 1 | 11 | 11 |
| 1 | 12 | 11 |
| 2 | 20 | 21 |
| 2 | 21 | 21 |
| 2 | 22 | 21 |
+---------+---------+-------------+
다음은 3가지 관련 함수 FIRST_VALUE, NTH_VALUE, LAST_VALUE 의 결과를 반환하는 예입니다.
쿼리는 세 행 너비의 슬라이딩 윈도우 프레임을 생성하며, 여기에는 다음이 포함됩니다.
현재 행에 선행하는 행.
현재 행.
현재 행 다음에 오는 행.
NTH_VALUE(i, 2)
호출의2
는 윈도우 프레임의 두 번째 행(이 경우, 현재 행이기도 함)을 지정합니다.현재 행이 윈도우 프레임의 맨 처음 행인 경우, 참조할 선행 행이 없으므로 FIRST_VALUE 는 해당 행에 대해 NULL을 반환합니다.
프레임 경계가 파티션의 행을 넘어 확장되는 경우가 있지만 존재하지 않는 행은 윈도우 함수 계산에 포함되지 않습니다. 예를 들어 현재 행이 파티션의 첫 번째 행이고 윈도우 프레임이
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING
인 경우 참조할 선행 행이 없으므로 FIRST_VALUE 함수는 파티션에서 첫 번째 행의 값을 반환합니다.테이블의 데이터가 주어졌을 때 세 가지 함수 모두에 대해 결과가 일치하지 않습니다. 이 함수는 프레임의 각 행에 대해 첫 번째, 마지막 또는 n번째 값을 선택하며, 선택한 값은 각 파티션에 개별적으로 적용됩니다.
이 예제를 실행하려면 먼저 테이블을 생성하고 로딩합니다.
CREATE TABLE demo1 (i INTEGER, partition_col INTEGER, order_col INTEGER);
INSERT INTO demo1 (i, partition_col, order_col) VALUES
(1, 1, 1),
(2, 1, 2),
(3, 1, 3),
(4, 1, 4),
(5, 1, 5),
(1, 2, 1),
(2, 2, 2),
(3, 2, 3),
(4, 2, 4);
이제 다음 쿼리를 실행합니다.
SELECT partition_col, order_col, i,
FIRST_VALUE(i) OVER (PARTITION BY partition_col ORDER BY order_col
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS FIRST_VAL,
NTH_VALUE(i, 2) OVER (PARTITION BY partition_col ORDER BY order_col
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS NTH_VAL,
LAST_VALUE(i) OVER (PARTITION BY partition_col ORDER BY order_col
ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS LAST_VAL
FROM demo1
ORDER BY partition_col, i, order_col;
+---------------+-----------+---+-----------+---------+----------+
| PARTITION_COL | ORDER_COL | I | FIRST_VAL | NTH_VAL | LAST_VAL |
|---------------+-----------+---+-----------+---------+----------|
| 1 | 1 | 1 | 1 | 2 | 2 |
| 1 | 2 | 2 | 1 | 2 | 3 |
| 1 | 3 | 3 | 2 | 3 | 4 |
| 1 | 4 | 4 | 3 | 4 | 5 |
| 1 | 5 | 5 | 4 | 5 | 5 |
| 2 | 1 | 1 | 1 | 2 | 2 |
| 2 | 2 | 2 | 1 | 2 | 3 |
| 2 | 3 | 3 | 2 | 3 | 4 |
| 2 | 4 | 4 | 3 | 4 | 4 |
+---------------+-----------+---+-----------+---------+----------+