카테고리:

윈도우 함수 (순위 관련, 윈도우 프레임)

FIRST_VALUE

정렬된 값 그룹 내의 첫 번째 값을 반환합니다.

참고 항목:

LAST_VALUE , NTH_VALUE

구문

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

window_frame 구문에 대한 자세한 내용은 윈도우 프레임 구문과 사용법 을 참조하십시오.

인자

expr

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

expr1

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

PARTITION BY column_1, column_2
expr2

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

ORDER BY column_3, column_4

사용법 노트

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

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

    똑같거나 대/소문자를 구분하지 않는 비교에서 똑같은 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

    구문 및 예를 비롯하여 윈도우 프레임에 대한 자세한 내용은 윈도우 프레임 구문과 사용법 을 참조하십시오.

이는 FIRST_VALUE() 를 사용하는 간단한 쿼리를 보여줍니다. 이 쿼리에는 두 개의 ORDER BY 하위 절이 포함되어 있는데, 하나는 각 파티션의 행 순서를 제어하고 다른 하나는 전체 쿼리의 출력 순서를 제어합니다.

SELECT
        column1,
        column2,
        FIRST_VALUE(column2) OVER (PARTITION BY column1 ORDER BY column2 NULLS LAST) AS column2_first
    FROM VALUES
       (1, 10), (1, 11), (1, null), (1, 12),
       (2, 20), (2, 21), (2, 22)
    ORDER BY column1, column2;
+---------+---------+---------------+
| COLUMN1 | COLUMN2 | COLUMN2_FIRST |
|---------+---------+---------------|
|       1 |      10 |            10 |
|       1 |      11 |            10 |
|       1 |      12 |            10 |
|       1 |    NULL |            10 |
|       2 |      20 |            20 |
|       2 |      21 |            20 |
|       2 |      22 |            20 |
+---------+---------+---------------+

다음 쿼리는 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 |
+---------------+-----------+---+-----------+---------+----------+
맨 위로 이동