데이터베이스 연구실.log

이전 값과 다음 값

분석 함수 LAG와 LEAD로 정렬 기준의 이전 행과 다음 행 값을 같은 행에 가져오는 방법과 기본값 규칙

LAGLEADOVER분석 함수오프셋

#핵심 요약

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와 정렬된 행의 인접 값
필요 권한 대상 테이블 소유자 또는 조회 권한이 있는 계정
바꿀 입력값 조회 대상 테이블, 열, 정렬 기준, 오프셋과 범위 밖 기본값
결과 해석 사원별 이전, 다음 행 값과 날짜 간격의 조회 출력은 기재 없음
SQL Developer 또는 SQL*Plus조회만 함
SELECT empno, ename, sal,
       LAG(sal, 1)  OVER (ORDER BY sal ASC) "그 전행",
       LEAD(sal, 1) OVER (ORDER BY sal ASC) "그 다음행"
  FROM emp;

결과 해석: 월급이 가장 낮은 사원의 "그 전행"과 가장 높은 사원의 "그 다음행"은 범위를 벗어나므로 NULL임

연습 문제(답 확인 불가): 입사일 순으로 바로 전에 입사한 사원의 입사일, 그 사원과의 입사 간격 일수
구문은 다음과 같음

SQL Developer 또는 SQL*Plus조회만 함
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 그룹별로 앞뒤 행 계산을 나누는 구문이며 그룹을 생략하면 조회 행 전체가 대상임

#사용 조건과 주의사항

정렬값이 같은 행 사이에서 어느 행이 앞서는지는 정렬 기준만으로 확정되지 않음
행을 하나로 식별하는 정렬 기준을 함께 두어 이전, 다음 행의 의미를 고정하는 방식임

SEO_HKabsumveritas@gmail.comBuilt with Claude Code & Codex

마지막 갱신 개인 학습 기록이며 운영 환경 적용 전 공식 문서 확인 필요

두 글자 이상 입력, 위아래 화살표로 이동하고 Enter로 열기