카테고리:

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

NTH_VALUE

정렬된 값 그룹 내의 n번째 값(최대 1000)을 반환합니다.

참고 항목:

FIRST_VALUE , LAST_VALUE

구문

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

사용법 노트

  • 입력 값 n 은 1000보다 클 수 없습니다.

  • FROM { FIRST | LAST } 가 지정되지 않은 경우, 기본값은 FIRST 입니다(즉, 방향은 정렬된 목록의 시작 부분부터임).

  • { IGNORE | RESPECT } NULLS 가 지정되지 않은 경우, 기본값은 RESPECT NULLS 입니다(즉, 식에 NULL 값이 포함되고 이것이 식의 n번째 값인 경우, 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

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

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 |
+---------+---------+-------------+

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