여러 ROW를 묶어 그룹으로 정하는 건데 조언 부탁드립니다. 0 2 1,088

by 허승호 [SQL Query] [2022.05.13 15:57:13]


먼저 데이터 부터 보여드립니다. 구조는 간단합니다.

테이블명은 SEQ_TB로 할께요.

SEQ TIME
1 10:00
2 11:00
3 12:00
4 13:00
5 14:00
6 15:00
7 16:00

SEQ_TB 테입블에 7개의 ROW가 있습니다.

이 7개의 ROW들을 3개의 로우로 묶습니다.  

대신 묶는 방식은 이렇습니다. 

SEQ를  1~3 까지 묶고 다음 2~4를 묶고 3~5.... 최종은 5~7 까지묶습니다.

그리고 묶은것을 그룹을 정해 줍니다.

그룹정해주는 방식은 예를들어 SEQ 칼럼의 1~3 묶은것을 제일 숫자가 낮은 SEQ 로 정하니 1이 됩니다.

이어서 SEQ 칼럼의 2~4 묶은것을 제일 숫자가 낮은 SEQ로 정하니 2가 됩니다.... 그리고 최종은 5~7은 그룹이 5가 되겠지요.

최종적으로 나와야 되는것은 아래와 같습니다. TIME도 같이 표기되어야 합니다.

GROUP SEQ TIME
1 1 10:00
1 2 11:00
1 3 12:00
2 2 11:00
2 3 12:00
2 4 13:00
3 3 12:00
3 4 13:00
3 5 14:00
4 4 13:00
4 5 14:00
4 6 15:00
5 5 14:00
5 6 15:00
5 7 16:00

ORACLE 11g SQL 로 작성중인데 멍하니 모니터만 바라보고만 있습니다.

by 마농 [2022.05.13 16:32:14]
WITH seq_tb AS
(
SELECT 1 seq, '10:00' tm FROM dual
UNION ALL SELECT 2, '11:00' FROM dual
UNION ALL SELECT 3, '12:00' FROM dual
UNION ALL SELECT 4, '13:00' FROM dual
UNION ALL SELECT 5, '14:00' FROM dual
UNION ALL SELECT 6, '15:00' FROM dual
UNION ALL SELECT 7, '16:00' FROM dual
)
SELECT CONNECT_BY_ROOT(seq) grp
     , seq
     , tm
  FROM seq_tb
 START WITH seq <= (SELECT MAX(seq) - 2 FROM seq_tb)
 CONNECT BY PRIOR seq + 1 = seq
   AND LEVEL <= 3
;

group, time 등의 예약어를 명칭으로 사용하는 것은 좋지 않습니다.


by 허승호 [2022.05.13 16:46:15]

마농님.. 감사합니다.

이렇게 간단히 표현해 주시다니 

구현에 많은 되움이 될 것 같습니다.

CONNECT BY 문을 좀 더 공부해야 겠습니다. ㅜㅜ

주말 잘 보내십시요.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입