본문 바로가기

Paul Work/Sql

READ(), LAG() 함수

ANALYTIC 함수로, SELF JOIN 하지 않고 하나의 테이블에서 동시에 한 행(ROW) 이상을 접근 할 수 있다
이렇게 말로 써 놓으니 잘 모르겠군...

[형식]
LEAD(VALUE_EXPR[,OFFSET][,DEFAULT]) OVER([QUERRY_PARTITION_CLAUSE] ORDER_BY_CLAUSE)

예제 : 
==================================================================================================
SELECT CLASSID, AVGPOINTS,
       LAG(AVGPOINTS,  1) OVER (ORDER BY CLASSID) PREVAVG,
       LEAD(AVGPOINTS, 1) OVER (ORDER BY CLASSID) NEXTAVG
  FROM (
        SELECT '2-1' CLASSID , 98.3  AVGPOINTS FROM DUAL UNION ALL 
        SELECT '2-2' CLASSID , 72.5  AVGPOINTS FROM DUAL UNION ALL   
        SELECT '2-3' CLASSID , 58.9  AVGPOINTS FROM DUAL UNION ALL    
        SELECT '2-4' CLASSID , 88.2  AVGPOINTS FROM DUAL
      )
==================================================================================================
-------------결과 ------------------
   CLASSID        AVGPOINTS      PREVAVG      NEXTAVG
     2-1                   98.3                                    72.5
     2-2                   72.5                 98.3              58.9
     2-3                   58.9                 72.5              88.2
     2-4                   88.2                 58.9


LAG(AVGPOINTS,  1) OVER (ORDER BY CLASSID) PREVAVG 
//커서를 뒤로 이동하여 조회하고자 하는 값 AVGPOINTS, 이동되는 수 1, 정렬기준 CLASSID

LEAD(AVGPOINTS, 1) OVER (ORDER BY CLASSID) NEXTAVG
//커서를 앞으로 이동하여 조회하고자 하는 값 AVGPOINTS, 이동되는 수 1, 정렬기준 CLASSID
[출처] 오라클 분석함수 LAG() & LEAD()|작성자 웁스
http://blog.naver.com/bilang?Redirect=Log&logNo=110032829240



응용 예제 : 숫자중에 중간에 빠진 숫자를 찾기 위한 응용 예제
==================================================================================================
SELECT *
  FROM (
        SELECT LEAD(NUM,1,0) OVER(ORDER BY NUM) AS LNUM,
                     NUM , LEAD(NUM,1,0) OVER(ORDER BY NUM) - NUM AS TOT
          FROM (
                SELECT TO_CHAR(USESEQ,'00000') AS NUM FROM INF.RNDBANKSEND
                 ORDER BY 1
               )
       )
 WHERE TOT > 1
 ORDER BY  NUM DESC ;
==================================================================================================
-------------결과 ------------------
LNUM          NUM             TOT
   0              54218         -54218
 54218          54217             1
 54217          54216             1
 54216          54215             1
 54215          54214             1
 54214          54213             1
 54213          54212             1
 54212          54211             1

아래 좀 더 자세한 예를 봐보자.