본문 바로가기

IT/SQL

LAG, LEAD 함수

LAG 함수

 - LAG 함수를 이용해 파티션별 윈도우에서 이전 몇번째 행의 값을 가져올 수 있다. SQL SERVER에서는 지원하지 않는다.

- EX) 직원들의 입사일자가 빠른 기준으로 정렬을 하고, 본인보다 입사일자가 한 명 앞선 사원의 급여를 본인의 급여와 함께 출력한다. 

 SELECT ENAME

           ,HIREDATE

           ,SAL

           ,LAG(SAL) OVER(ORDER BY HIREDATE) AS PREV_SAL

   FROM EMP

  WHERE JOB = 'SALESMAN'


    ENAME HIREDATE   SAL      PREV_SAL

1 ALLEN 1981-02-20 1600.00

2 WARD 1981-02-22 1250.00 1600

3 TURNER 1981-09-08 1500.00 1250

4 MARTIN 1981-09-28 1250.00 1500


,LAG(SAL) OVER(ORDER BY HIREDATE) AS PREV_SAL  여기에 HIREDATE 뒤에 DESC만 넣으면 입사일자가 나보다 한 발 늦은 사원의 급여를 표기한다.

    ENAME HIREDATE SAL PREV_SAL
1 MARTIN 1981-09-28 1250.00
2 TURNER 1981-09-08 1500.00 1250
3 WARD 1981-02-22 1250.00 1500
4 ALLEN 1981-02-20 1600.00 1250


 - LAG 함수는 3개의 ARGUMENT 값이 올 수 있는데, 두번째 인자는 몇번째 앞의 행을 가져올지 결정하는 것이고(DEFAULT는 1이다), 세번째 인자는 예를들어 파티션의 첫번째 행의 경우 가져올 데이터가 없어 NULL 값이 들어오는데 이경우 다른 값으로 바꾸어 줄 수 있다. 결과적으로 NULL이나 NVL 처리와 비슷하다.



LEAD 함수

 - LEAD 함수를 이용해 파티션별 윈도우에서 이후 몇번째 행의 값을 가져올 수 있다. 역시 SQL SERVER에서 지원하지 않는 기능이다
 - 직원들을 입사일자가 빠른 기준으로 정렬을 하고 바로 다음에 입사한 인력의 입사일자를 함께 출력한다.
 
 SELECT ENAME
           ,HIREDATE
           ,LEAD(HIREDATE, 1, '9999-01-31') OVER(ORDER BY HIREDATE) AS NEXT_SAL
   FROM EMP

    ENAME HIREDATE NEXT_SAL

1 SMITH 1980-12-17 1981-02-20

2 ALLEN 1981-02-20 1981-02-22

3 WARD 1981-02-22 1981-04-02

4 JONES 1981-04-02 1981-05-01

5 BLAKE 1981-05-01 1981-06-09

6 CLARK 1981-06-09 1981-09-08

7 TURNER 1981-09-08 1981-09-28

8 MARTIN 1981-09-28 1981-11-17

9 KING         1981-11-17 1981-12-03

10 JAMES 1981-12-03 1981-12-03

11 FORD         1981-12-03 1982-01-23

12 MILLER 1982-01-23 1987-07-13  

13 SCOTT 1987-07-13 1987-07-13

14 ADAMS 1987-07-13 9999-01-31