Создайте таблицу временных меток до текущей даты в Teradata

#sql #teradata

Вопрос:

Я хочу создать представление, в котором есть все метки времени до текущей даты с добавочным часом, и сохранить его как представление в teradata. Как мне это сделать? Я видел несколько способов использования рекурсии, но это не помогает.

дата_х
1/1/2021 0:00
1/1/2021 1:00
1/1/2021 2:00
1/1/2021 3:00
1/1/2021 4:00
 CREATE VIEW db1.table1 WITH RECURSIVE DateRanges(CALENDAR_DATE) AS
(
SELECT DATE '2020-01-01' AS CALENDAR_DATE
FROM
( SELECT * FROM 
(SELECT NULL AS X)X) DUMMYTABLE
UNION ALL
SELECT
CALENDAR_DATE   INTERVAL '1' DAY
FROM
DateRanges
WHERE
CALENDAR_DATE < CURRENT_DATE
)
SELECT *
FROM DateRanges;
 

Ответ №1:

Рекурсия не очень эффективна для большого количества уровней. Но есть едва известный синтаксис НОРМАЛИЗАЦИИ Teradata:

 REPLACE VIEW DateRanges AS
SELECT BEGIN(pd) AS TS
EXPAND ON PERIOD(CAST(DATE '2021-04-01' AS TIMESTAMP(0))
                ,CAST(TRUNC(CURRENT_TIMESTAMP(0)) AS TIMESTAMP(0))) AS pd
          BY INTERVAL '1' HOUR
 

Обычно РАСШИРЕНИЕ работает только тогда, когда доступ к таблице осуществляется ИЗ, но применение функции TRUNC, похоже, забывает об этом правиле 🙂

Если синтаксический анализатор все еще жалуется на отсутствие, вы можете использовать любой выбор, возвращающий одну строку. Я предпочитаю sys_calendar, потому что есть право публичного доступа:

 SELECT BEGIN(pd) AS TS
FROM sys_calendar.calendar
WHERE calendar_date = current_date
EXPAND ON PERIOD(CAST(DATE '2021-04-01' AS TIMESTAMP(0))
                ,CAST(CURRENT_DATE AS TIMESTAMP(0))) AS pd
          BY INTERVAL '1' HOUR
 

Комментарии:

1. По крайней мере, как прямой выбор, это не работает для меня. Получите переполнение даты и времени во втором приведении так, как оно написано. Если я использую trunc(current_timestamp) , я получаю ошибку о необходимости таблицы в предложении from. Я могу подделать это с помощью CTE, но это не работает в представлении 🙁

2. @dnoeth Представление сохраняется, и я могу просматривать содержимое, однако я не могу запустить инструкцию select для него. Мне понадобится эта таблица, чтобы соединить ее с другими таблицами. Как мне сделать так, чтобы это произошло?

3. Я получаю сообщение об ошибке, в котором говорится о незаконном предложении или агрегации в ВЫБОРЕ без доступа к таблице.

4. Затем поместите фиктивную производную таблицу, как FROM (SELECT 1 X) Y перед EXPAND