- 카테고리:
윈도우 함수 (순위 관련, 윈도우 프레임)
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
구문 및 예를 비롯하여 윈도우 프레임에 대한 자세한 내용은 윈도우 프레임 구문과 사용법 을 참조하십시오.
예¶
이는 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 |
+---------------+-----------+---+-----------+---------+----------+