카테고리:

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

LAST_VALUE

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

참고 항목:

FIRST_VALUE , NTH_VALUE

구문

LAST_VALUE( <expr> ) [ { IGNORE | RESPECT } NULLS ]
  OVER ( [ PARTITION BY <expr1> ] ORDER BY <expr2> [ { ASC | DESC } ] [ NULLS { FIRST | LAST } ] [ <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

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') ...
    
    Copy

    똑같거나 대/소문자를 구분하지 않는 비교에서 똑같은 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);
Copy
+---------+---------+--------------+
| 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 의 결과를 반환하는 예입니다.

  • 쿼리는 세 행 너비의 슬라이딩 윈도우 프레임을 생성하며, 여기에는 다음이 포함됩니다.

    • 현재 행에 선행하는 행.

    • 현재 행.

    • 현재 행 다음에 오는 행.

  • The 2 in the call NTH_VALUE(menu_price_usd, 2) specifies the second row in the window frame (which, in this case, is also the current row).

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

  • 프레임 경계가 파티션의 행을 넘어 확장되는 경우가 있지만 존재하지 않는 행은 윈도우 함수 계산에 포함되지 않습니다. 예를 들어 현재 행이 파티션의 첫 번째 행이고 윈도우 프레임이 ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING 인 경우 참조할 선행 행이 없으므로 FIRST_VALUE 함수는 파티션에서 첫 번째 행의 값을 반환합니다.

  • 테이블의 데이터가 주어졌을 때 세 가지 함수 모두에 대해 결과가 일치하지 않습니다. 이 함수는 프레임의 각 행에 대해 첫 번째, 마지막 또는 n번째 값을 선택하며, 선택한 값은 각 파티션에 개별적으로 적용됩니다.

SELECT menu_category, menu_item_name, menu_price_usd,
       FIRST_VALUE(menu_price_usd) OVER (PARTITION BY menu_category ORDER BY menu_price_usd
         ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS first_val,
       NTH_VALUE(menu_price_usd, 2) OVER (PARTITION BY menu_category ORDER BY menu_price_usd
         ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS nth_val,
       LAST_VALUE(menu_price_usd) OVER (PARTITION BY menu_category ORDER BY menu_price_usd
         ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS last_val
  FROM menu_items
  WHERE menu_category = 'Dessert'
  ORDER BY menu_price_usd;
Copy
+---------------+--------------------+----------------+-----------+---------+----------+
| MENU_CATEGORY | MENU_ITEM_NAME     | MENU_PRICE_USD | FIRST_VAL | NTH_VAL | LAST_VAL |
|---------------+--------------------+----------------+-----------+---------+----------|
| Dessert       | Popsicle           |           3.00 |      3.00 |    4.00 |     4.00 |
| Dessert       | Ice Cream Sandwich |           4.00 |      3.00 |    4.00 |     5.00 |
| Dessert       | Mango Sticky Rice  |           5.00 |      4.00 |    5.00 |     6.00 |
| Dessert       | Sugar Cone         |           6.00 |      6.00 |    6.00 |     7.00 |
| Dessert       | Waffle Cone        |           6.00 |      5.00 |    6.00 |     6.00 |
| Dessert       | Two Scoop Bowl     |           7.00 |      6.00 |    7.00 |     7.00 |
+---------------+--------------------+----------------+-----------+---------+----------+