-- 좀더 간결한 방법이 있을 것 같지만 생각나는대로 적어봅니다. WITH T AS ( SELECT 1 ID, NULL PID, 'A' VAL FROM DUAL UNION ALL SELECT 2 ID, 1 PID, 'B' VAL FROM DUAL UNION ALL SELECT 3 ID, 1 PID, 'C' VAL FROM DUAL UNION ALL SELECT 4 ID, 2 PID, 'D' VAL FROM DUAL UNION ALL SELECT 5 ID, NULL PID, 'E' VAL FROM DUAL UNION ALL SELECT 6 ID, 5 PID, 'F' VAL FROM DUAL UNION ALL SELECT 7 ID, 5 PID, 'G' VAL FROM DUAL ) SELECT V2.LV, VAL FROM ( SELECT V.*, COUNT(DECODE(RNK, 1, 1)) OVER () CNT FROM ( SELECT LEVEL LV, VAL, DENSE_RANK() OVER (ORDER BY CONNECT_BY_ROOT ID) RNK, ROWNUM RN FROM T START WITH PID IS NULL CONNECT BY PRIOR ID = PID ORDER BY ID ) V ) V2 WHERE RNK = 1 OR RN = CNT + 1;
-- 이런 방법도. with t as ( select 1 rn, 1 lv , 'A' data from dual union all select 2 rn, 2 lv , 'B' data from dual union all select 3 rn, 2 lv , 'C' data from dual union all select 4 rn, 3 lv , 'D' data from dual union all select 5 rn, 1 lv , 'E' data from dual union all select 6 rn, 2 lv , 'F' data from dual union all select 7 rn, 2 lv , 'G' data from dual ) select rn,lv,data,grp from ( select rn,lv,data ,sum(decode(lv,1,1)) over (order by rn rows between unbounded preceding and 1 preceding) grp from t ) where nvl(grp,1) = 1