Да, вы можете создать хранимую процедуру, которая генерирует динамический SQL, используя только необходимые таблицы. Смотрите мой ответ здесь, чтобы начать шаблон: Проблема с передачей имени столбца в качестве параметра "ПОДГОТОВИТЬ" в Redshift
Тем не менее, вы должны знать, что Redshift может автоматически достичь большинства из того, что вы хотите, используя представление «Таблица временных рядов». Это задокументировано здесь:
Вы определяете представление, состоящее из UNION ALL, по последовательности идентичных таблиц с ключом сортировки, определенным для обычно фильтруемого столбца даты или отметки времени. Когда вы запрашиваете это представление, Redshift может исключить сканирование любых таблиц UNION, которые не содержат соответствующих данных.
Например:
CREATE OR REPLACE VIEW store_sales_vw
AS SELECT * FROM store_sales_1998
UNION ALL SELECT * FROM store_sales_1999
UNION ALL SELECT * FROM store_sales_2001
UNION ALL SELECT * FROM store_sales_2002
UNION ALL SELECT * FROM store_sales_2003
;
SELECT cd.cd_education_status
,COUNT(*) sales_count
,AVG(ss_quantity) avg_quantity
FROM store_sales_vw vw
JOIN customer_demographics cd
ON vw.ss_cdemo_sk = cd.cd_demo_sk
WHERE ss_sold_ts BETWEEN '1999-09-01' AND '2000-08-31'
GROUP BY cd.cd_education_status
В этом примере Redshift будет использовать только таблицы store_sales_1999
и store_sales_2000
, пропуская другие таблицы в представлении. Обратите внимание, что пропуск таблицы не основан на названии таблицы. Redshift знает значения MIN и MAX временной метки ключа сортировки в каждой таблице.
Если вы используете такой подход, убедитесь, что общий размер UNION достаточно низок. Я рекомендую (самое большее) ежедневные таблицы за последнюю неделю [7], еженедельные таблицы за последний месяц [5], квартальные таблицы за последний год [4], а затем годовые таблицы для более старых данных.
Вы можете использовать ALTER TABLE… APPEND , чтобы объединить ежедневные таблицы в недельные таблицы и так далее.