본문 바로가기
Database/Oracle

[ORACLE] LAG() 함수 : PARTITION BY와 함께 쓰는 고급 예제

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

오라클 LAG() 함수: PARTITION BY와 함께 쓰는 고급 예제
Oracle LAG()

 

Oracle SQLLAG() 함수는 분석 함수(Analytic Function)의 하나로, 특정 행에서 이전 행의 값을 참조할 수 있게 해주는 매우 유용한 도구입니다. 시간 흐름이나 순서를 고려한 데이터 비교, 증감 계산 등에 적합하며, 실무 데이터 분석에서 광범위하게 활용됩니다.

1. LAG() 함수란?

LAG(expr [, offset [, default]]) OVER (PARTITION BY... ORDER BY...) 형식으로 사용되며, 지정된 expr의 이전 값을 반환합니다.

  • expr: 참조할 칼럼
  • offset: 몇 행 전 데이터를 참조할지 (기본값 1)
  • default: 이전 행이 없을 경우 반환할 기본값

2. 기본 사용 예제

SELECT employee_id, salary,
       LAG(salary) OVER (ORDER BY employee_id) AS prev_salary
FROM employees;

직원 ID 순으로 정렬한 후, 각 직원의 급여와 이전 직원의 급여를 함께 조회합니다.

3. PARTITION BY와 함께 사용

부서 내에서 이전 행 값을 구할 수 있습니다.

SELECT department_id, employee_id, salary,
       LAG(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS prev_salary
FROM employees;

4. OFFSET 및 기본값 지정

두 행 이전 값 또는 NULL 대신 기본값 설정:

SELECT employee_id, salary,
       LAG(salary, 2, 0) OVER (ORDER BY employee_id) AS salary_2_before
FROM employees;

5. 실무 활용 예제

5.1 월별 매출 증감 계산

SELECT month, revenue,
       revenue - LAG(revenue) OVER (ORDER BY month) AS revenue_diff
FROM monthly_sales;

5.2 날짜별 주가 변화

SELECT trade_date, close_price,
       close_price - LAG(close_price) OVER (ORDER BY trade_date) AS price_change
FROM stock_prices;

5.3 고객 방문 간격 계산

SELECT customer_id, visit_date,
       visit_date - LAG(visit_date) OVER (PARTITION BY customer_id ORDER BY visit_date) AS days_between
FROM visits;

6. LAG() vs LEAD()

함수 기능 예시
LAG() 이전 행의 값 LAG(salary) OVER (ORDER BY id)
LEAD() 다음 행의 값 LEAD(salary) OVER (ORDER BY id)

7. 성능 및 주의사항

  • ORDER BY 없이 사용하면 결과 예측 불가
  • OFFSET 값이 현재 위치보다 크면 기본값 또는 NULL 반환
  • 실행 계획에서 Window Sort 발생 → 인덱스 고려 필요

8. 복합 계산 예시

8.1 누적 증가율 계산

SELECT month, revenue,
       ROUND((revenue - LAG(revenue) OVER (ORDER BY month)) / LAG(revenue) OVER (ORDER BY month) * 100, 2) AS growth_rate
FROM monthly_sales;

8.2 상태 변화 감지

SELECT user_id, login_status,
       CASE
         WHEN login_status != LAG(login_status) OVER (PARTITION BY user_id ORDER BY event_time) THEN 'Changed'
         ELSE 'Same'
       END AS status_change
FROM login_logs;

9. FAQ - 자주 묻는 질문

Q1. LAG()는 NULL 값을 반환할 수 있나요?

A. 예, 이전 행이 없으면 기본적으로 NULL이 반환됩니다.

Q2. 숫자가 아닌 데이터에도 사용할 수 있나요?

A. 가능합니다. 문자형, 날짜형 등 모든 데이터 타입에서 작동합니다.

Q3. ORDER BY가 필수인가요?

A. 실질적으로는 필수입니다. 정렬 기준이 없으면 의미 있는 결과를 보장할 수 없습니다.

10. 요약

LAG() 함수는 Oracle SQL에서 시간 흐름 기반 또는 순서 기반의 데이터 비교를 위해 필수적인 도구입니다. 이전 값을 참조하여 증감률 계산, 변화 감지, 간격 계산 등 다양한 업무 시나리오에 활용할 수 있습니다. LEAD(), PARTITION BY, ORDER BY와 결합하여 더욱 정교한 분석이 가능합니다.

출처

728x90