Window Function 3 - LEAD & LAG

Ryan·2025년 1월 15일

SQL/Python 분석

목록 보기
57/94

1. LEAD & LAG 함수란?

LEAD는 “다음 행(N칸 뒤)의 값”을, LAG는 “이전 행(N칸 앞)의 값”을 현재 행에서 조회할 수 있도록 해주는 윈도우 함수(Window Function)입니다.

  • 기본적으로 N=1 → 바로 다음/이전 행
  • N을 지정해 2행 뒤, 3행 뒤 등 더 멀리 떨어진 행의 값을 가져올 수도 있습니다.
  • OVER (ORDER BY ~ [PARTITION BY ~]) 구문을 통해 “앞뒤”의 기준이 되는 정렬/그룹을 정의합니다.

2. 기본 문법 구조

sql
코드 복사
SELECT
  LEAD(<Column>, N, <Default_Value>) OVER (
    PARTITION BY <파티션컬럼>
    ORDER BY <정렬컬럼>
  ) AS lead_col,
  LAG(<Column>, N, <Default_Value>) OVER (
    PARTITION BY <파티션컬럼>
    ORDER BY <정렬컬럼>
  ) AS lag_col
FROM 테이블;
  • PARTITION BY <파티션컬럼> : 특정 컬럼(예: 부서, 팀, 국가 등)에 따라 나누어진 그룹 내에서만 순서를 판단.
  • ORDER BY <정렬컬럼> : 그룹 내부에서 앞뒤를 구분할 순서 기준(날짜, ID, JobLevel 등).
  • N(생략 시 1) : 몇 행 차이를 볼지 지정.
  • <Default_Value>(선택 사항) : 가져올 행이 없을 때(예: 첫 번째/마지막 행) 반환할 값. 생략 시 NULL.

3. PARTITION BY Department, ORDER BY JobLevel 예시

3-1. 데이터 구조

예를 들어, 부서(Department)별로 직원들의 JobLevel이 1부터 5까지 있을 때,

아래처럼 PARTITION을 “Department”로, 정렬기준을 “JobLevel”로 두어 각 부서 안에서 JobLevel 순으로 “앞뒤” 행을 확인할 수 있습니다.

DepartmentJobLevelhc
Human Resources133
Human Resources213
Human Resources36
Human Resources44
Human Resources57
Research & Development1434
Research & Development2281
.........
Sales176
Sales2240
Sales383
Sales434
Sales513
  • 여기서 hc는 각 (Department, JobLevel) 조합별 인원수라고 가정.

3-2. 쿼리 예시

sql
코드 복사
SELECT
    Department,
    JobLevel,
    COUNT(hn.EmployeeNumber) AS hc,
    LEAD(COUNT(hn.EmployeeNumber))
       OVER (
         PARTITION BY Department
         ORDER BY JobLevel
       ) AS lead_hc,
    LAG(COUNT(hn.EmployeeNumber))
       OVER (
         PARTITION BY Department
         ORDER BY JobLevel
       ) AS lag_hc
FROM hr.hr_cate hc
LEFT JOIN hr.hr_number hn
       ON hc.EmployeeNumber = hn.EmployeeNumber
GROUP BY Department, JobLevel
ORDER BY Department, JobLevel;

해석

  • GROUP BY Department, JobLevel
    • 부서와 직무레벨별로 인원수를 집계 (hc).
  • PARTITION BY Department
    • 각 부서마다 별도의 그룹으로 나누어 JobLevel 순서 내에서 LEAD/LAG를 계산.
    • 즉, 같은 부서 내에서만 “앞뒤” 행을 찾아봄.
  • ORDER BY JobLevel
    • JobLevel이 낮은 값 → 높은 값 순으로 “이전/다음”을 판단.
  • LEAD(COUNT(...))
    • 같은 부서, 다음 JobLevel의 인원수가 무엇인지 현재 행에 표시.
  • LAG(COUNT(...))
    • 같은 부서, 이전 JobLevel의 인원수를 현재 행에 표시.

결과 예시

DepartmentJobLevelhclead_hclag_hc
Human Resources13313NULL
Human Resources213633
Human Resources36413
Human Resources4476
Human Resources57NULL4
Research & Development1434281NULL
Research & Development2281329434
Research & Development332968281
...............
Sales4341383
Sales513NULL34
  • 부서가 달라지면(예: Human Resources → R&D) PARTITION이 끊어지고, 새 파티션이 시작되므로 lag_hc, lead_hc가 NULL이 됩니다(경계선).
  • 한 부서 내부에서는 JobLevel이 하나씩 올라갈 때마다 바로 앞/뒤 인원수를 쉽게 조회 가능.

4. 활용 포인트

  1. 부서별, 카테고리별로 순번이 있는 데이터일 때,
    • 전 레벨/다음 레벨이 뭔지 간단히 확인 가능(매우 직관적).
  2. 날짜별, 시간 순으로 이전/다음 행 참조
    • PARTITION BY Department 대신 PARTITION BY 없이, ORDER BY sale_date 등으로 전일 대비, 전주 대비, 전월 대비 등으로 활용 가능.
  3. N 파라미터
    • LEAD(COUNT(...), 2) 식으로 더 멀리 떨어진 행(2칸 뒤 등)도 참조 가능.
  4. 디폴트 값
    • 행이 없는 경우 NULL이 나오는 대신, 특정 숫자나 ‘NA’처럼 별도 값을 넣을 수 있습니다.
    • 예: LAG(COUNT(...), 1, 0) → 첫 번째 행에 이전 값이 없으면 0 출력.

5. 정리

  • LEAD & LAG는 윈도우 함수 중에서도 “앞뒤 행” 값을 참조하는 데 특화된 함수입니다.
  • PARTITION BY를 활용해 “각 부서/팀/카테고리별”로 나누고, ORDER BY로 “그 안에서의 순서”를 지정하면,
    • 같은 파티션 안에서만 이전/다음 행을 가져오므로, 예) 부서가 다르면 NULL.
  • “전일 대비”, “이전 레벨 대비”, “다음 항목 예측” 등 시나리오에 자주 활용되며, SQL로 시계열 분석이나 순차 비교를 할 때 매우 유용합니다.
  • DBMS마다 문법이 약간 다를 수 있으나, 최근 MySQL(8.0+), PostgreSQL, Oracle, SQL Server 모두 LEAD/LAG를 지원합니다.

결론:

  1. GROUP BY로 “(부서, JobLevel)별 인원수”를 구한 뒤,
  2. Window 함수(LEAD/LAG)로 같은 파티션(Department 내)에서 앞뒤 JobLevel의 인원수를 참조,
  3. 한 행에 “현재 레벨 인원수 + 이전 레벨 인원수 + 다음 레벨 인원수” 등을 함께 볼 수 있음.

이처럼 Window 함수를 잘 활용하면, 더 풍부하고 직관적인 데이터 비교/분석이 가능하니, 꼭 익혀두기를 권장합니다!

0개의 댓글