- 카테고리:
윈도우 함수 구문 및 사용법 (순위 지정)
LAST_VALUE¶
정렬된 값 그룹 내의 마지막 값을 반환합니다.
- 참고 항목:
구문¶
LAST_VALUE( <expr> ) [ { IGNORE | RESPECT } NULLS ]
OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] [ <window_frame> ] )
자세한 window_frame
구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.
인자¶
expr
반환 값을 결정하는 식입니다.
expr1
행을 분할하는 데 사용하는 식입니다. 단일 식 또는 쉼표로 구분된 식 목록을 지정할 수 있습니다. 예:
PARTITION BY column_1, column_2
expr2
행을 정렬하는 데 사용하는 식입니다. 단일 식 또는 쉼표로 구분된 식 목록을 지정할 수 있습니다. 예:
ORDER BY column_3, column_4
{ IGNORE | RESPECT } NULLS
expr
에 NULL 값이 포함된 경우 NULL 값을 무시할지 또는 적용할지 여부입니다.IGNORE NULLS
는 NULL 이 아닌 마지막 값을 반환합니다.RESPECT NULLS
는 식의 마지막 값인 경우 NULL 값을 반환합니다.
기본값:
RESPECT NULLS
사용법 노트¶
이 함수는 순위와 관련된 함수이므로 윈도우를 지정해야 합니다. 윈도우 절은 다음 하위 절로 구성됩니다.
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
은 함수가 계산되는 윈도우 내의 행 하위 세트를 지정합니다. 윈도우 프레임을 지정하지 않으면 기본 프레임은 전체 윈도우입니다.ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
이 동작은 윈도우 프레임에 대해 다음 기본값을 지정하는 ANSI 표준과는 다릅니다.
RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
자세한 window_frame
구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.
예¶
첫 번째 예는 column1
로 분할된 column2
에 대한 LAST_VALUE 결과를 반환합니다.
SELECT
column1,
column2,
LAST_VALUE(column2) OVER (PARTITION BY column1 ORDER BY column2) AS column2_last
FROM VALUES
(1, 10), (1, 11), (1, 12),
(2, 20), (2, 21), (2, 22);
+---------+---------+--------------+
| COLUMN1 | COLUMN2 | COLUMN2_LAST |
|---------+---------+--------------|
| 1 | 10 | 12 |
| 1 | 11 | 12 |
| 1 | 12 | 12 |
| 2 | 20 | 22 |
| 2 | 21 | 22 |
| 2 | 22 | 22 |
+---------+---------+--------------+
다음은 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 |
+---------------+-----------+---+-----------+---------+----------+