
Oracle SQL의 LAST_VALUE() 함수는 분석 함수 중 하나로, 지정된 정렬 기준에서 마지막 행의 값을 반환합니다. 시계열 데이터 분석이나 그룹 내 마지막 값을 추출할 때 유용하게 사용됩니다.
1. LAST_VALUE() 함수란?
LAST_VALUE(expr) OVER (PARTITION BY... ORDER BY... ROWS BETWEEN...) 형식으로 사용되며, 윈도 내 가장 마지막 행의 expr 값을 반환합니다.
- expr: 반환할 칼럼
- PARTITION BY: 그룹 기준
- ORDER BY: 정렬 기준
- ROWS BETWEEN: 윈도 범위 (옵션에 따라 결과가 달라짐)
2. 기본 사용 예제
SELECT employee_id, salary,
LAST_VALUE(salary) OVER (ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AS last_salary
FROM employees;
입사일 기준으로 전체를 정렬한 후, 마지막 행의 급여를 반환합니다.
3. PARTITION BY 사용
SELECT employee_id, department_id, salary,
LAST_VALUE(salary) OVER (
PARTITION BY department_id
ORDER BY hire_date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS dept_last_salary
FROM employees;
부서별로 정렬하여 마지막 급여 값을 가져옵니다.
4. ROWS BETWEEN 범위의 중요성
기본 윈도 프레임은 RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW로, 이 경우 마지막 행이 아닌 현재 행 기준이 됩니다. 명확히 UNBOUNDED FOLLOWING을 지정해야 마지막 값을 정확히 가져올 수 있습니다.
5. 실무 활용 예제
5.1 고객별 마지막 구매 금액
SELECT customer_id, purchase_date, amount,
LAST_VALUE(amount) OVER (
PARTITION BY customer_id
ORDER BY purchase_date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS last_amount
FROM purchases;
5.2 프로젝트별 마지막 상태
SELECT project_id, status_update, status,
LAST_VALUE(status) OVER (
PARTITION BY project_id
ORDER BY status_update
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS latest_status
FROM project_log;
5.3 주가의 마지막 종가
SELECT stock_symbol, trade_date, close_price,
LAST_VALUE(close_price) OVER (
PARTITION BY stock_symbol
ORDER BY trade_date
ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS final_close
FROM stock_prices;
6. FIRST_VALUE()와의 비교
| 함수 | 반환 값 | 주의사항 |
|---|---|---|
| FIRST_VALUE() | 윈도우 내 첫 번째 행 | 정렬 기준 중요 |
| LAST_VALUE() | 윈도우 내 마지막 행 | ROWS BETWEEN 설정 필수 |
7. 성능 팁과 고려 사항
- 불필요한
UNBOUNDED FOLLOWING은 성능 저하 유발 가능 - 윈도 범위가 클수록 리소스 사용 증가
- 정렬 대상 칼럼에 인덱스를 부여하면 속도 개선 가능
8. 고급 활용 시나리오
8.1 마지막 상태 비교
SELECT employee_id, status,
CASE WHEN status != LAST_VALUE(status) OVER (
PARTITION BY employee_id ORDER BY update_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING)
THEN '변경됨' ELSE '유지' END AS status_change_flag
FROM employee_status_log;
8.2 마지막 행과 현재 행 비교
SELECT region, sales,
LAST_VALUE(sales) OVER (
PARTITION BY region ORDER BY quarter ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
) AS latest_sales,
sales - LAST_VALUE(sales) OVER (...) AS sales_gap
FROM quarterly_sales;
9. 자주 묻는 질문(FAQ)
Q1. LAST_VALUE()는 정렬 기준이 없다면 어떻게 동작하나요?
A. ORDER BY가 없으면 임의의 행이 기준이 되어 예측할 수 없습니다. 반드시 정렬 기준을 명확히 지정해야 합니다.
Q2. NULL 값도 반환되나요?
A. 예, 마지막 행의 값이 NULL일 경우 그대로 반환됩니다.
Q3. MIN/MAX와 차이점은?
A. LAST_VALUE()는 정렬 순서에 따른 위치 기반 값을 반환하며, MIN/MAX는 값 기준입니다.
10. 요약
LAST_VALUE()는 윈도 내 마지막 값을 추출하는 Oracle SQL 분석 함수입니다. PARTITION BY와 ORDER BY, ROWS BETWEEN을 함께 사용하여 유연한 데이터 분석이 가능하며, 실무에서 최종 상태 확인, 마지막 거래 내역 조회 등 다양한 분야에 활용할 수 있습니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/database/
- Oracle Live SQL: https://livesql.oracle.com
- Stack Overflow - SQL 분석 함수 관련 실무 사례
- SQL Tutorial by Mode Analytics
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] NTILE() 함수로 순위 그룹 나누기 완벽 가이드 (0) | 2025.06.01 |
|---|---|
| [ORACLE] CUME_DIST()로 누적 백분위 실무 중심 예제로 배우기 (0) | 2025.06.01 |
| [ORACLE] FIRST_VALUE() 함수 실전 예제 모음 : PARTITION BY와 함께 (0) | 2025.06.01 |
| [ORACLE] LEAD() 함수와 LAG() 함수 비교 분석 (0) | 2025.06.01 |
| [ORACLE] LAG() 함수 : PARTITION BY와 함께 쓰는 고급 예제 (0) | 2025.06.01 |