본문 바로가기
Database/Oracle

[ORACLE] LEAD() 함수와 LAG() 함수 비교 분석

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

오라클 LEAD() 함수와 LAG() 함수 비교 분석
Oracle LEAD()

 

 

 

Oracle SQLLEAD() 함수는 분석 함수(Analytic Function) 중 하나로, 현재 행 기준으로 다음 행의 데이터를 참조할 수 있는 매우 강력한 함수입니다. 시계열 데이터 분석, 증감률 계산, 사용자 행동 분석 등 다양한 실무 영역에서 유용하게 활용됩니다.

1. LEAD() 함수란?

LEAD(expr [, offset [, default]]) OVER (PARTITION BY... ORDER BY...) 형식으로 사용되며, 현재 행 기준으로 n행 뒤의 값을 반환합니다.

  • expr: 참조할 칼럼
  • offset: 몇 행 뒤 값을 참조할지 (기본값 1)
  • default: 다음 행이 없을 때 반환할 기본값

2. 기본 사용 예제

SELECT employee_id, salary,
       LEAD(salary) OVER (ORDER BY employee_id) AS next_salary
FROM employees;

직원 ID 기준으로 정렬한 후, 다음 직원의 급여를 조회합니다.

3. PARTITION BY와 함께 사용

부서별로 그룹을 나눈 후 다음 행 참조:

SELECT department_id, employee_id, salary,
       LEAD(salary) OVER (PARTITION BY department_id ORDER BY employee_id) AS next_salary
FROM employees;

4. OFFSET과 기본값 지정

두 행 뒤의 값을 참조하고, 데이터가 없을 경우 기본값 0을 반환:

SELECT employee_id, salary,
       LEAD(salary, 2, 0) OVER (ORDER BY employee_id) AS salary_2_after
FROM employees;

5. 실무 활용 예제

5.1 월별 매출 대비 다음 달 매출 비교

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

5.2 주가의 다음일 종가 참조

SELECT trade_date, close_price,
       LEAD(close_price) OVER (ORDER BY trade_date) AS next_close_price
FROM stock_prices;

5.3 고객 방문 간격 계산 (리드 기반)

SELECT customer_id, visit_date,
       LEAD(visit_date) OVER (PARTITION BY customer_id ORDER BY visit_date) - visit_date AS days_until_next
FROM visits;

6. LEAD() vs LAG()

함수 의미 예제
LAG() 이전 행 참조 LAG(salary) OVER (ORDER BY id)
LEAD() 다음 행 참조 LEAD(salary) OVER (ORDER BY id)

7. 성능 및 사용 시 주의사항

  • ORDER BY가 없으면 순서가 보장되지 않음
  • OFFSET이 데이터 범위를 초과하면 NULL 또는 기본값 반환
  • 많은 OFFSET 또는 PIVOT 연산이 포함되면 성능 저하 유의

8. 고급 활용 예시

8.1 증감률 계산

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

8.2 이벤트 종료 시점 파악

SELECT user_id, start_time, end_time,
       LEAD(start_time) OVER (PARTITION BY user_id ORDER BY start_time) AS next_start
FROM session_log;

9. FAQ - 자주 묻는 질문

Q1. LEAD()는 숫자 외 다른 데이터 타입에도 사용 가능한가요?

A. 네, 문자열, 날짜형, 불리언 등 다양한 데이터 타입에 사용할 수 있습니다.

Q2. 기본값은 필수인가요?

A. 기본값은 선택입니다. 지정하지 않으면 NULL 반환됩니다.

Q3. LAG와 함께 사용할 수 있나요?

A. 네, 증감률, 변화 감지 등에서는 LAG, LEAD를 함께 쓰는 것이 효과적입니다.

10. 요약

LEAD() 함수는 Oracle SQL에서 미래 시점의 데이터를 현재 행과 비교하거나 시간순 정렬된 데이터를 분석할 때 유용하게 사용됩니다. PARTITION BY, ORDER BY와 함께 사용하면 다양한 데이터 패턴 분석이 가능하며, 시계열 비교, 고객 분석, 매출 예측 등 실무에서 자주 활용됩니다.

출처

728x90