|
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 ) ; |