이전 값과 다음 값
분석 함수 LAG와 LEAD로 정렬 기준의 이전 행과 다음 행 값을 같은 행에 가져오는 방법과 기본값 규칙
#핵심 요약
LAG(컬럼, n) OVER (ORDER BY...)는 정렬 기준으로 n행 앞의 값, LEAD는 n행 뒤의 값을 가져옴
넣은 숫자만큼 행을 이동함
셀프 조인 없이 여러 행을 한 번에 볼 수 있음
n을 생략하면 1, 범위를 벗어나면 기본값(지정하지 않으면 NULL)을 돌려줌
GROUP BY와 함께 쓸 필요가 없음
#개념과 동작 원리
LAG는 쿼리가 돌려주는 행들과 커서 위치가 있을 때, 그 위치보다 주어진 물리적 오프셋만큼 앞의 행에 접근함
오프셋은 0보다 큰 정수임
생략하면 1임
오프셋이 윈도 범위를 벗어나면 선택 인수인 기본값을 돌려주고, 기본값을 생략하면 NULL임
LEAD는 정렬된 행에서 지정한 오프셋만큼 뒤의 값에 접근함
실습 기출 해설: LAG(sal, 1) OVER (ORDER BY sal ASC)는 월급 오름차순에서 바로 이전 행(월급이 한 단계 낮은 사원)의 월급임
#주요 용어와 구성 요소
| 구문 | 의미 |
|---|---|
| value_expr | 이전, 다음 행에서 가져올 값이며 다른 분석 함수를 직접 중첩할 수 없음 |
| offset, default | 이동 행 수와 범위 밖 반환값이며 현재 행의 NULL을 default로 대체하는 기능은 아님 |
#필수 명령어 또는 SQL
| 항목 | 실행 조건 |
|---|---|
| 작업 대상 | emp의 sal, hiredate와 정렬된 행의 인접 값 |
| 필요 권한 | 대상 테이블 소유자 또는 조회 권한이 있는 계정 |
| 바꿀 입력값 | 조회 대상 테이블, 열, 정렬 기준, 오프셋과 범위 밖 기본값 |
| 결과 해석 | 사원별 이전, 다음 행 값과 날짜 간격의 조회 출력은 기재 없음 |
SELECT empno, ename, sal,
LAG(sal, 1) OVER (ORDER BY sal ASC) "그 전행",
LEAD(sal, 1) OVER (ORDER BY sal ASC) "그 다음행"
FROM emp;결과 해석: 월급이 가장 낮은 사원의 "그 전행"과 가장 높은 사원의 "그 다음행"은 범위를 벗어나므로 NULL임
연습 문제(답 확인 불가): 입사일 순으로 바로 전에 입사한 사원의 입사일, 그 사원과의 입사 간격 일수
구문은 다음과 같음
SELECT ename, hiredate,
LAG(hiredate, 1) OVER (ORDER BY hiredate) 이전입사일,
hiredate - LAG(hiredate, 1) OVER (ORDER BY hiredate) 간격일
FROM emp
ORDER BY hiredate;결과 해석: 개별 실행 출력은 기재 없음
#구문과 옵션 설명
| 구문 | 의미 |
|---|---|
| RESPECT NULLS | NULL 행도 위치 계산에 포함하며 기본 동작임 |
| IGNORE NULLS | 대상 값이 NULL인 행을 계산에서 제외함 |
| OVER의 PARTITION BY | 그룹별로 앞뒤 행 계산을 나누는 구문이며 그룹을 생략하면 조회 행 전체가 대상임 |
#사용 조건과 주의사항
정렬값이 같은 행 사이에서 어느 행이 앞서는지는 정렬 기준만으로 확정되지 않음
행을 하나로 식별하는 정렬 기준을 함께 두어 이전, 다음 행의 의미를 고정하는 방식임