728x90

Oracle SQL의 LAG() 함수는 분석 함수(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와 결합하여 더욱 정교한 분석이 가능합니다.
출처
- Oracle 공식 문서: https://docs.oracle.com/en/database/
- Oracle Live SQL: https://livesql.oracle.com
- Stack Overflow SQL 분석 함수 예제
- SQL Tutorial: Analytic Functions Explained
728x90
'Database > Oracle' 카테고리의 다른 글
| [ORACLE] FIRST_VALUE() 함수 실전 예제 모음 : PARTITION BY와 함께 (0) | 2025.06.01 |
|---|---|
| [ORACLE] LEAD() 함수와 LAG() 함수 비교 분석 (0) | 2025.06.01 |
| [ORACLE] VARIANCE()로 분산 분석하기 : GROUP BY와 함께 활용하는 방법 (0) | 2025.06.01 |
| [ORACLE] STDDEV() 함수로 표준편차 계산하는 방법 (0) | 2025.06.01 |
| [ORACLE] MAX() 함수로 그룹 별 최대 값 구하는 법 (0) | 2025.06.01 |