LEAD는 “다음 행(N칸 뒤)의 값”을, LAG는 “이전 행(N칸 앞)의 값”을 현재 행에서 조회할 수 있도록 해주는 윈도우 함수(Window Function)입니다.
N=1 → 바로 다음/이전 행N을 지정해 2행 뒤, 3행 뒤 등 더 멀리 떨어진 행의 값을 가져올 수도 있습니다.OVER (ORDER BY ~ [PARTITION BY ~]) 구문을 통해 “앞뒤”의 기준이 되는 정렬/그룹을 정의합니다.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 테이블;
N(생략 시 1) : 몇 행 차이를 볼지 지정.<Default_Value>(선택 사항) : 가져올 행이 없을 때(예: 첫 번째/마지막 행) 반환할 값. 생략 시 NULL.예를 들어, 부서(Department)별로 직원들의 JobLevel이 1부터 5까지 있을 때,
아래처럼 PARTITION을 “Department”로, 정렬기준을 “JobLevel”로 두어 각 부서 안에서 JobLevel 순으로 “앞뒤” 행을 확인할 수 있습니다.
| Department | JobLevel | hc |
|---|---|---|
| Human Resources | 1 | 33 |
| Human Resources | 2 | 13 |
| Human Resources | 3 | 6 |
| Human Resources | 4 | 4 |
| Human Resources | 5 | 7 |
| Research & Development | 1 | 434 |
| Research & Development | 2 | 281 |
| ... | ... | ... |
| Sales | 1 | 76 |
| Sales | 2 | 240 |
| Sales | 3 | 83 |
| Sales | 4 | 34 |
| Sales | 5 | 13 |
hc는 각 (Department, JobLevel) 조합별 인원수라고 가정.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, JobLevelhc).ORDER BY JobLevelLEAD(COUNT(...))LAG(COUNT(...))| Department | JobLevel | hc | lead_hc | lag_hc |
|---|---|---|---|---|
| Human Resources | 1 | 33 | 13 | NULL |
| Human Resources | 2 | 13 | 6 | 33 |
| Human Resources | 3 | 6 | 4 | 13 |
| Human Resources | 4 | 4 | 7 | 6 |
| Human Resources | 5 | 7 | NULL | 4 |
| Research & Development | 1 | 434 | 281 | NULL |
| Research & Development | 2 | 281 | 329 | 434 |
| Research & Development | 3 | 329 | 68 | 281 |
| ... | ... | ... | ... | ... |
| Sales | 4 | 34 | 13 | 83 |
| Sales | 5 | 13 | NULL | 34 |
PARTITION BY Department 대신 PARTITION BY 없이, ORDER BY sale_date 등으로 전일 대비, 전주 대비, 전월 대비 등으로 활용 가능.LEAD(COUNT(...), 2) 식으로 더 멀리 떨어진 행(2칸 뒤 등)도 참조 가능.LAG(COUNT(...), 1, 0) → 첫 번째 행에 이전 값이 없으면 0 출력.결론:
이처럼 Window 함수를 잘 활용하면, 더 풍부하고 직관적인 데이터 비교/분석이 가능하니, 꼭 익혀두기를 권장합니다!