본문 바로가기
Database/Oracle

[ORACLE] LAST_VALUE() 함수 사용법 및 PARTITION BY 활용 법

by Papa Martino V 2025. 6. 1.
728x90

오라클 LAST_VALUE() 함수 사용법 및 PARTITION BY 활용법
Oracle LAST_VALUE()

 

 

 

Oracle SQLLAST_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 BYORDER BY, ROWS BETWEEN을 함께 사용하여 유연한 데이터 분석이 가능하며, 실무에서 최종 상태 확인, 마지막 거래 내역 조회 등 다양한 분야에 활용할 수 있습니다.

출처

728x90