- 카테고리:
윈도우 함수 구문 및 사용법 (순위 지정)
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
를 지정할 수도 있습니다.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
자세한 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 |
+---------+---------+---------------+
다음 쿼리는 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 |
+---------------+-----------+---+-----------+---------+----------+