반응형
Vertica DB에서 여러 Row, Column를 만들 수 있는 재귀 쿼리를 기재한다.
우선 Oracle에서만 제공하는 계층 쿼리 CONNECT BY LEVEL을 활용할 수 없어서, Vertica DB에서 제공하는 RECURSIVE WITH 절로 여러 Row, Column을 만들 수 있다.
예시를 들겠지만 RECURSIVE 사용시 앞단에, 쿼리 호출마다 ALTER SESSION을 사용해야 하므로 Vertica DB에 보다 효율적인 Timeseries를 활용법도 기재한다.
1. Oracle (CONNECT BY LEVEL)
--1.1 Oracle 1~3까지 여러 Row, Column 만들기
--1.2 Oracle 2023년 1월 부터 12월까지 생성
2. Vertica (Recursive WITH절)
--2.1 Vertica 1~3까지 여러 Row, Column 만들기
ALTER SESSION SET PARAMETER WithClauseRecursionLimit=2; -- 1 ~ 3까지 생성 WITH RECURSIVE nums (n) AS ( SELECT 1 UNION ALL SELECT n+1 FROM nums ) SELECT n,DECODE(n,1,'A',2,'B',3,'C') AS COL2 FROM nums; |
3. Vertica (Timeseries WITH절)
--3.1 Vertica 1~3까지 여러 Row, Column 만들기
WITH limits(ts) AS ( SELECT DATE '2000-01-01'::timestamp + 1 UNION ALL SELECT DATE '2000-01-01'::timestamp + 3 ) SELECT tm::DATE - DATE '2000-01-01' AS COL1, DECODE(COL1,1,'A',2,'B',3,'C') AS COL2 FROM limits TIMESERIES tm AS '1 day' OVER(ORDER BY ts); |
--3.2 Vertica 2023년 1월 부터 12월까지 생성
WITH limits(ts) AS ( SELECT DATE '2000-01-01'::timestamp + 1 UNION ALL SELECT DATE '2000-01-01'::timestamp + 12 ) SELECT '2023년 ' || LPAD(TO_CHAR(tm::DATE - DATE '2000-01-01'),2,'0') || '월' AS COL1 FROM limits TIMESERIES tm AS '1 Day' OVER(ORDER BY ts); |
TIMESERIES 기본 구문
TIMESERIES 시간칼럼 (=ts) AS 시간 단위 분할(second, min, day...) OVER (ORDER BY 시간칼럼)
**참조) Vertica Casting 3가지 구문
1) tm::DATE -> tm 컬럼을 Date 타입으로 Casting
2) DATE '2000-01-01' -> '2000-01-01' Data 타입으로 Casting
3) SELECT CAST('2000-01-01' AS DATE);
Oracle 참조 URL
https://meyouus.tistory.com/175
Vertica Recursive WITH절 URL
Vertica Timeseries URL
감사합니다!
반응형