2013-06-17 5 views
1

У меня проблема в Vertica, связанная с датами заполнения, которых не существует. Я видел решения в Интернете, где люди предлагали создать таблицу календаря. Вот такая проблема MYSQL из stackoverflow.Vertica - Создание таблицы календаря

Есть ли способ создать таблицу календаря, используя доступную дату min() и max() из другой таблицы, используя только SQL, поддерживаемый Vertica, и никаких процедур? Большинство решений, с которыми я столкнулся до сих пор, основаны на 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))