[ Oracle - LAG.LEAD() ]

 

 문제

 

  no | str | group |
  
------------------
  1  | ab  |   0   |
  
2  | cd  |   0   |
  3  | ef  |   0   |
  4  | gh  |  60   |
  5  | ij  |   0   |
  6  | kl  |   0   |
  7  | mn  |   30  |
  8  | mn  |   30  |
  9  | mn  |   0   |

이런 형식의 자료가 있습니다.
order
 by  no 기준으로 하면서 group 컬럼을 데이터 순서에 따라서 그룹을 지을  있는방법이 있나요?
말로 설명하자니  설명이 안되네요...아래 원하는 "zz" 컬럼 데이터 입니다.
도움 주시면 정말 감사하겠습니다...

  no | str | GRP   | B_GRP  |
  
---------------------------
  1  | ab  |   0   |    1   |
  2  | cd  |   0   |    1   |
  3  | ef  |   0   |    1   |
  4  | gh  |  60   |    2   |
  5  | ij  |   0   |    3   |
  6  | kl  |   0   |    3   |
  7  | mn  |  30   |    4   |
  8  | mn  |  30   |    4   |
  9  | mn  |   0   |    5   |

LAG  현재 게시물의  게시물 LEAD  현재 게시물의  게시물을 가져올수 있다.
LAG([가져올 컬럼명], [가져올 레코드 ]) OVER(ORDER BY [정렬할 컬럼 ] [정렬 방식])
LEAD([가져올 컬럼명], [가져올 레코드 ]) OVER(ORDER BY [정렬할 컬럼 ] [정렬 방식])
;

WITH T AS( 
    SELECT 1 NO, 'ab' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 2 NO, 'cd' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 3 NO, 'ef' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 4 NO, 'gh' STR, '60' GRP FROM DUAL UNION ALL
    SELECT 5 NO, 'ij' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 6 NO, 'kl' STR,  '0' GRP FROM DUAL UNION ALL
    SELECT 7 NO, 'mn' STR, '30' GRP FROM DUAL UNION ALL
    SELECT 8 NO, 'mn' STR, '30' GRP FROM DUAL UNION ALL
    SELECT 9 NO, 'mn' STR,  '0' GRP FROM DUAL 
) 
SELECT NO, STR, GRP, SUM(DECODE(GRP, BEF_GRP, 0, 1)) OVER(ORDER BY NO) B_GRP
  FROM (
        SELECT NO, STR, GRP, LAG(GRP, 1) OVER(ORDER BY NO) BEF_GRP
          FROM T
        ORDER BY NO
       )
  ;

'(DB) Oracle > SQL.통계-통계함수' 카테고리의 다른 글

Oracle - ROLLUP예제1  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - RANK()  (0) 2017.01.21
Oracle - ROLLUP  (0) 2017.01.21
Oracle - GROUPING / GROUPING_ID  (0) 2017.01.21
Posted by 농부지기
,