#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