활용 5. 첫번째, 마지막 행의 값 추출하기
-- 모양새
FIRST_VALUE(컬럼) OVER(PARTITION BY 컬럼 ORDER BY 컬럼)
LAST_VALUE(컬럼) OVER(PARTITION BY 컬럼 ORDER BY 컬럼)
- FIRST_VALUE( ) : 윈도우 프레임 내에서 첫 번째 행의 컬럼 값을 반환.
- LAST_VALUE( ) : 윈도우 프레임 내에서 마지막 행의 컬럼 값을 반환. (단, LAST_VALUE() 의 경우 원하는 결과를 얻으려면 윈도우 프레임을 명시적으로 설정해주는 것이 중요하다)
-- 예제
SELECT time
, subject
, val
, FIRST_VALUE(val) OVER w AS 'first'
, LAST_VALUE(val) OVER w AS 'last',
FROM observations
WINDOW w AS (PARTITION BY subject ORDER BY time ROWS UNBOUNDED PRECEDING);
-- OUTPUT:
+----------+---------+------+-------+------+--------+--------+
| time | subject | val | first | last | second | fourth |
+----------+---------+------+-------+------+--------+--------+
| 07:00:00 | st113 | 10 | 10 | 10 | NULL | NULL |
| 07:15:00 | st113 | 9 | 10 | 9 | 9 | NULL |
| 07:30:00 | st113 | 25 | 10 | 25 | 9 | NULL |
| 07:45:00 | st113 | 20 | 10 | 20 | 9 | 20 |
| 07:00:00 | xh458 | 0 | 0 | 0 | NULL | NULL |
| 07:15:00 | xh458 | 10 | 0 | 10 | 10 | NULL |
| 07:30:00 | xh458 | 5 | 0 | 5 | 10 | NULL |
| 07:45:00 | xh458 | 30 | 0 | 30 | 10 | 30 |
| 08:00:00 | xh458 | 25 | 0 | 25 | 10 | 30 |
+----------+---------+------+-------+------+--------+--------+
FIRST_VALUE와 LAST_VALUE 함수의 작동 방식에서 이런 차이가 나는 이유
윈도우 프레임의 기본값(default)
: RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
=> 현재 행까지의 모든 이전 행을 포함한다.
- RANGE: 값의 '범위'를 기준으로 설정.
- UNBOUNDED PRECEDING: 프레임의 시작을 첫 번째 행으로 설정.
- CURRENT ROW: 프레임의 끝을 현재 행으로 설정.
윈도우 프레임을 명시적으로 설정하지 않는 경우, 윈도우 프레임의 기본값(default)으로 "RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW" 가 적용된다. 윈도우 프레임을 명시적으로 설정해주지 않아 윈도우 프레임이 기본값으로 적용되어 있는 경우 FIRST_VALUE는 적용된 윈도우 프레임에 따라 항상 첫 번째 행의 값을 반환하지만, LAST_VALUE는 현재 행의 값을 반환하게 된다. 따라서 LAST_VALUE를 통해 전체 행 범위 내에서 마지막 행의 값을 반환하도록 하려면, 윈도우 프레임이 전체 행 범위로 적용되도록 'RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING' 와 같이 윈도우 프레임을 명시적으로 설정해주어야 한다.
[참고] N번째 행의 값 추출하기
NTH_VALUE( ) :
-- 모양새
NTH_VALUE(컬럼) OVER(PARTITION BY 컬럼 ORDER BY 컬럼)
'데이터 처리 도구 > SQL' 카테고리의 다른 글
[MySQL] 정규표현식 함수 (Regular Expressions) (0) | 2024.07.11 |
---|---|
정규 표현식(Regular Expression) (0) | 2024.03.20 |
[MySQL] 집합 연산(1): UNION, UNION ALL 사용하여 조회 결과 결합하기 (0) | 2022.09.07 |
[MySQL] 비트 연산과 관련 함수(CONV, BIN, BIT_LENGTH) (0) | 2022.09.04 |
[MySQL] 날짜/시간 다루기 (2) 연산하기 (0) | 2022.08.30 |