본문 바로가기

프로그램/oracle

sys_connect_by_path()를 group by 절에서 사용하기

반응형

시작일 종료일이 존재하는 스케쥴 테이블 존재 하고
각 row별로 월화수목금 에 해당하는 값이 존재시

이를 하나의 row로 표시할 경우

/*
 level 값을 붙임으로서 path 가 제일 아래인 것의 값을 max로 불러올 수 있게 됨
 substr로 7부터 자르는 것은 rpad가 5부터이고 , 를 생각해서 6자리 이후 것들만 뽑기 위해임
*/
select max(id)
 , max(stdy)
 , max(endy)
 , substr(max(rpad(level, 5, '-') || sys_connect_by_path(dowk, ',')), 7) as dowk_lst
from (
 /*
  row_number 에서 stdy, endy 로 묶고 dowk 기준으로 정렬하여 순번을 생성
 */
 select a.*
  , row_number() over(partition by stdy, endy order by dowk) as rn
 from (
  /*
   스케쥴 테이블에서 id가 sklee인 사람의 stdy, endy, dowk(날짜) 기준으로
   중복되지 않게 쭉 뽑아냄.
   schedule 테이블은 시간 도 포함되어 같은 stdy, endy 에 대하 시간대별로
   많은 row를 가지게 됨
  */
  select distinct
   id
   , stdy
   , endy
   , dowk
  from schedule
  where id = 'sklee'
 ) a
)
connect by prior rn = rn - 1
and prior stdy
and prior endy
group by stdy, endy
order by stdy