- 카테고리:
- 윈도우 함수 구문 및 사용법 (순위 지정) 
FIRST_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
- 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은 함수가 계산되는 윈도우 내의 행 하위 세트를 지정합니다.- window_frame이 지정되지 않은 경우, 기본값은 전체 윈도우입니다.- ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING- 이는 윈도우 프레임에 대해 다음 기본값을 지정하는 ANSI 표준과는 다릅니다. - RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
자세한 window_frame 구문은 윈도우 함수 구문 및 사용법 섹션을 참조하십시오.
예¶
이 예에서는 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 |
+---------+---------+---------------+
다음은 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 |
+---------------+-----------+---+-----------+---------+----------+