2013-06-17 2 views
1

존재하지 않는 날짜를 입력하는 것과 관련된 Vertica에서 문제가 있습니다. 사람들이 캘린더 테이블을 만들 것을 제안한 온라인 솔루션을 보았습니다. 여기에 그 중 하나가 MYSQL stackoverflow에서 발생합니다.Vertica - 캘린더 테이블 만들기

Vertica가 지원하는 SQL을 사용하고 절차가없는 다른 테이블의 min() 및 max() 사용 가능 날짜를 사용하여 달력 테이블을 만드는 방법이 있습니까? 지금까지 살펴본 대부분의 솔루션은 T-SQL을 기반으로하며 날짜는 프로 시저를 사용하여 생성됩니다. 불행히도 Vertica는 실제로 PL/SQL 또는 T-SQL 기능을 많이 갖고 있지 않습니다. 하지만 내 문제를 해결할 수있을 것으로 의심되는 일부 분석 기능이 있습니다.

답변

3

질문에서 언급했듯이 시작일과 종료일을 사용하여 캘린더 테이블이나보기를 만드는 문제에 대한 해결책을 찾았으니 지금 대답하고 있습니다.

CREATE table mytest.calendar 
(
    date DATE primary key 
); 

경계 날짜를 캘린더 테이블 (원하는 테이블의 최소 및 최대 날짜)에 삽입하십시오.

Insert into mytest.calendar (select min(date) from mytest.benchmarks); 
Insert into mytest.calendar (select max(date) from mytest.benchmarks); 

이제 생성하는 중간 날짜는 다음을 수행하십시오

SELECT CAST(slice_time AS DATE) date 
    FROM mytest.calendar mtc 
    TIMESERIES slice_time as '1 day' 
    OVER (ORDER BY CAST(mtc.date as TIMESTAMP)); 

당신은 사용할 수를 그 자체의 테이블로 :

SELECT date from 
(SELECT CAST(slice_time AS DATE) date 
    FROM mytest.calendar mtc 
    TIMESERIES slice_time as '1 day' 
    OVER (ORDER BY CAST(mtc.date as TIMESTAMP))) calendar 
where mytest.isBusinessDay(date) = 't'; 

SELECT date 
    FROM 
(SELECT date 
    FROM 
     (SELECT CAST(slice_time AS DATE) date 
      FROM mytest.calendar mtc 
    TIMESERIES slice_time as '1 day' 
      OVER (ORDER BY CAST(mtc.date as TIMESTAMP)) 
     ) calendar 
WHERE mytest.isBusinessDay(date) = 't') calendar; 

내가 처음부터 날짜의 내 목록을 가지고 (벤치 마크 표의 min(date))에서 종료일 (max(date))