카테고리:

윈도우 함수 구문 및 사용법 (순위 지정)

LAST_VALUE

정렬된 값 그룹 내의 마지막 값을 반환합니다.

참고 항목:

FIRST_VALUE , NTH_VALUE

구문

LAST_VALUE( <expr> ) [ { IGNORE | RESPECT } NULLS ]
  OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ <window_frame> ] )
Copy

자세한 window_frame 구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.

인자

expr

반환 값을 결정하는 식입니다.

expr1

행을 분할하는 데 사용하는 식입니다. 단일 식 또는 쉼표로 구분된 식 목록을 지정할 수 있습니다. 예:

PARTITION BY column_1, column_2
Copy
expr2

행을 정렬하는 데 사용하는 식입니다. 단일 식 또는 쉼표로 구분된 식 목록을 지정할 수 있습니다. 예:

ORDER BY column_3, column_4
Copy

사용법 노트

  • 다른 시스템에서의 이 함수 구현에 대한 호환성을 위해 함수 인자에 { IGNORE | RESPECT } NULLS 를 지정할 수도 있습니다.

    LAST_VALUE( <식> [ { IGNORE | RESPECT } NULLS ] ) OVER ...

  • { IGNORE | RESPECT } NULLS 가 지정되지 않은 경우, 기본값은 RESPECT NULLS 입니다. 예를 들어 식에 NULL 값이 포함되어 있고 이것이 식의 마지막 값인 경우 NULL 값이 반환됩니다.

  • 이 함수는 순위와 관련된 함수이므로 윈도우를 지정해야 합니다. 윈도우 절은 다음 하위 절로 구성됩니다.

    • PARTITION BY <식1> 하위 절(선택 사항).

    • ORDER BY <expr2> 하위 절(필수). 추가로 지원되는 순서 지정 옵션(정렬 순서, NULL 값 순서 지정 등)에 대한 자세한 내용은 같은 규칙을 따르는 ORDER BY 쿼리 구문에 대한 설명서를 참조하십시오.

    • window_frame 하위 절(선택 사항).

  • 윈도우에서 행의 순서와 그에 따른 쿼리 결과는 ORDER BY 절의 키가 각 행을 고유하게 만드는 경우에만 완전히 결정적입니다. 다음 예를 살펴보겠습니다.

    ... OVER (PARTITION BY p ORDER BY o COLLATE 'lower') ...
    
    Copy

    똑같거나 대/소문자를 구분하지 않는 비교에서 똑같은 o 열의 값이 파티션에 포함된 경우 쿼리 결과가 달라질 수 있습니다.

  • OVER 절 내의 ORDER BY 절은 전체 쿼리 출력의 행 순서가 아니라 윈도우 내의 행 순서만 제어합니다. 출력 순서를 제어하려면 쿼리의 가장 바깥쪽 수준에서 별도의 ORDER BY 절을 사용하십시오.

  • 선택적 window_frame 은 함수가 계산되는 윈도우 내의 행 하위 세트를 지정합니다.

    • 이 함수는 범위 기반 윈도우 프레임이 아닌 행 기반 윈도우 프레임만 지원합니다.

      지원됨:

      ROWS BETWEEN ... AND ...

      지원되지 않음:

      RANGE BETWEEN ... AND ...

    • window_frame 이 지정되지 않은 경우, 기본값은 전체 윈도우입니다.

      ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING

      이 동작은 윈도우 프레임에 대해 다음 기본값을 지정하는 ANSI 표준과는 다릅니다.

      RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW

자세한 window_frame 구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.

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);
Copy
+---------+---------+--------------+
| COLUMN1 | COLUMN2 | COLUMN2_LAST |
|---------+---------+--------------|
|       1 |      10 |           12 |
|       1 |      11 |           12 |
|       1 |      12 |           12 |
|       2 |      20 |           22 |
|       2 |      21 |           22 |
|       2 |      22 |           22 |
+---------+---------+--------------+

다음 쿼리는 FIRST_VALUE, NTH_VALUE, LAST_VALUE 의 출력을 대조합니다. 참고:

  • 쿼리는 다음을 포함하는 3행 너비의 슬라이딩 윈도우 프레임을 만듭니다.

    • 현재 행에 선행하는 행.

    • 현재 행.

    • 현재 행 다음에 오는 행.

  • NTH_VALUE(i, 2) 호출의 2 는 윈도우 프레임의 두 번째 행(이 경우, 현재 행이기도 함)을 지정합니다.

  • 현재 행이 윈도우 프레임의 맨 처음 행인 경우, 참조할 선행 행이 없으므로 FIRST_VALUE() 는 해당 행에 대해 NULL을 반환합니다.

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 |      NULL |       1 |        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 |      NULL |       1 |        2 |
|             2 |         2 | 2 |         1 |       2 |        3 |
|             2 |         3 | 3 |         2 |       3 |        4 |
|             2 |         4 | 4 |         3 |       4 |        4 |
+---------------+-----------+---+-----------+---------+----------+
Copy