게시일: Dec 14, 2011 11:21:48 PM
- 하나의 쿼리에서 동시에 다른 로우의 값에 접근할 수 있는 함수
[구문 형식]
LAG ( expr, offset, default ) OVER ( PARTITION BY 절 )
LEAD ( expr, offset, default ) OVER ( PARTITION BY 절 )
- LAG : 계산 대상 데이터(로우)들을 PARTITION BY 절로 구분하여, expr에 명시된 값을 기준으로 이전 로우의 값을 반환
off : 생략 가능한데, 생략할 경우 기본값(1)으로 설정됨 (바로 이전 로우의 값을 반환)
default: offset에 지정된 로우가 존재하지 않을 경우 LAG 함수가 반환하는 기본 값. 이 역시 생략 가능
- LEAD : 이전 로우가 아닌 이후의 로우값을 반환
select hire_date
, count(*)
, LAG(count(*)) OVER (ORDER BY hire_date) lag1 -- 이전 년도 사원수
, LAG(count(*), 1, 0) OVER (ORDER BY hire_date) lag2 -- 이전 년도 사원수(상동)
, LAG(count(*), 2, 0) OVER (ORDER BY hire_date) lag3 -- 2년전 사원수
, LEAD(count(*)) OVER (ORDER BY hire_date) lead1 -- 이후 년도 사원수
, LEAD(count(*), 1, 0) OVER (ORDER BY hire_date) lead2 -- 이후 년도 사원수(상동)
, LEAD(count(*), 2, 0) OVER (ORDER BY hire_date) lead3 -- 2년후 사원수
from (select 100 id, '2011' hire_date from dual union all
select 101 id, '2010' hire_date from dual union all
select 102 id, '2011' hire_date from dual union all
select 103 id, '2010' hire_date from dual union all
select 104 id, '2009' hire_date from dual union all
select 105 id, '2009' hire_date from dual union all
select 106 id, '2009' hire_date from dual union all
select 107 id, '2008' hire_date from dual union all
select 108 id, '2007' hire_date from dual union all
select 109 id, '2006' hire_date from dual union all
select 100 id, '2006' hire_date from dual union all
select 111 id, '2006' hire_date from dual )
group by hire_date ;
---------------------------------------------------------------------
HIRE_DATE COUNT(*) LAG1 LAG2 LAG3 LEAD1 LEAD2 LEAD3
---------------------------------------------------------------------
2006 3 0 0 1 1 1
2007 1 3 3 0 1 1 3
2008 1 1 1 3 3 3 2
2009 3 1 1 1 2 2 2
2010 2 3 3 1 2 2 0
2011 2 2 2 3 0 0
---------------------------------------------------------------------