반응형
계층형 쿼리는 흔히 직위나 조직과 같이 계층형 구조를 가진 데이터를 조회할 때 사용합니다. 하지만 계층형 쿼리는 일련의 날짜를 생성하는 데에도 자주 활용됩니다. 이를 날짜 생성에 활용하는 방법을 알아봅니다.
[ Contents ]
1. CONNECT BY LEVEL
CONNECT BY 조건문
CONNECT BY LEVEL를 잘 이용하면, 반복문 FOR문처럼 순회하며 조회할 수 있습니다.
LEVEL이 FOR문의 i 변수라고 생각하시면 되며, 1부터 시작해서 2, 3, 4와 같이 +1씩 오릅니다.
SELECT LEVEL, LEVEL*2, LEVEL*LEVEL FROM DUAL
CONNECT BY LEVEL <= 5;
실제로 위 쿼리를 실행하면 LEVEL이 5가 될 때까지, 5번 순회합니다.
for(int i=1; i<=5; i++){
printf("%d %d %d \n", i, 2*i, i*i);
}
이런 for문이라고 생각하시면 쉽게 이해가 되실 듯합니다.
2. 일련의 날짜 생성
SELECT
'202312' || LPAD(LEVEL, 2, '0') AS DT
FROM DUAL
CONNECT BY LEVEL <= 31;
2023년 12월 날짜도 이런 식으로 쉽게 생성할 수 있습니다. 1부터 31까지 반복하며 날짜를 생성합니다.
SELECT
SUBSTR('20231204', 0, 6) || LPAD(LEVEL, 2, '0') AS DT
FROM DUAL
CONNECT BY LEVEL <= TO_CHAR(LAST_DAY('20231204'), 'DD')
특정 날짜에 구애받지 않도록 설계하려면 이런 식으로 하면 되겠죠.
위 SQL은 입력받은 날짜가 속한 달을 출력하는 쿼리입니다.
반응형
3. CONNECT BY 활용
1) 두 날짜 사이의 일자 생성
SELECT
TO_DATE('20231205', 'YYYYMMDD') + LEVEL - 1
FROM DUAL
CONNECT BY LEVEL <= TO_DATE('20231210', 'YYYYMMDD') - TO_DATE('20231205', 'YYYYMMDD') + 1
2023년 12월 05일부터 2023년 12월 10일까지의 날짜 생성하는 쿼리입니다.
두 날짜의 차이만큼 LEVEL이 순회하며, 시작일에 LEVEL을 더해가며 일자를 생성합니다.
2) 두 날짜 사이의 주말 생성
SELECT TO_DATE('20231201', 'YYYYMMDD') + LEVEL - 1 AS "주말"
, TO_CHAR(TO_DATE('20231201', 'YYYYMMDD') + LEVEL - 1, 'DY') AS "요일"
FROM DUAL
WHERE TO_CHAR(TO_DATE('20231201', 'YYYY-MM-DD') + LEVEL - 1, 'D') IN (7, 1)
CONNECT BY LEVEL <= (TO_DATE('20231231', 'YYYYMMDD') - TO_DATE('20231201', 'YYYYMMDD') + 1)
특정 기간 동안의 특정 요일만 생성할 수도 있습니다. 위 SQL은 2023년 12월 간 주말만 생성하는 쿼리입니다.
반응형
'Data Engineering > SQL' 카테고리의 다른 글
[Oracle] TRUNC과 GROUP BY 이용한 구간별 통계 조회 쿼리 (0) | 2024.01.11 |
---|---|
[Oracle] 손쉽게 데이터값을 수정하는 명령어 EDIT (Toad for Oracle) (0) | 2023.12.05 |
[Oracle] PL/SQL 프로시저 FOR LOOP (CURSOR, SELECT문 이용) (0) | 2023.10.13 |
[Oracle] COALESCE: Null이 아닌 가장 왼쪽 값을 찾는 함수 (0) | 2023.04.27 |
[ORACLE] 기존 튜플을 변형해서 테이블에 삽입하는 방법 (여러 건의 튜플 삽입) (0) | 2023.04.25 |
댓글