Агрегация для всех таблиц в БД

Все таблицы в моей базе данных содержат один и тот же столбец, назовите его date_marked_invalid. Я хотел бы найти MAX() над этими столбцами для всех таблиц. Есть ли способ получить их без запуска

SELECT MAX(date_marked_invalid) FROM one_particular_table

отдельно для каждой отдельной таблицы?

Для Postgres подобный хакерство поможет, но, насколько я могу судить, со Snowflake это не работает.


person RoyalTS    schedule 08.01.2020    source источник


Ответы (2)


Значения MIN / MAX всех столбцов хранятся в метаданных для каждой таблицы, но, к сожалению, недоступны, например, в. INFORMATION_SCHEMA.COLUMNS.

Если вы создаете хранимую процедуру, которая выполняет итерацию по таблицам в INFORMATION_SCHEMA.COLUMNS, это по-прежнему операция «только метаданные», но ее нужно выполнять вручную.

В Snowflake нет функций, которые могут запускать динамический SQL, как query_to_xml() Postgres.

Запрос на динамическое создание оператора агрегирования будет находиться в строке

SELECT
  'SELECT MAX(MX) FROM ('
   || LISTAGG(CHR(10)||'  SELECT MAX('||COLUMN_NAME||') MX FROM '
   || TABLE_CATALOG||'.'||TABLE_SCHEMA||'.'||TABLE_NAME, ' UNION')
  WITHIN GROUP (ORDER BY NULL)||CHR(10)||')' COL
FROM INFORMATION_SCHEMA.COLUMNS
GROUP BY COLUMN_NAME;
person Hans Henrik Eriksen    schedule 08.01.2020
comment
Как мне создать такую ​​хранимую процедуру? - person RoyalTS; 08.01.2020
comment
Если у вас есть фиксированный набор таблиц, используйте конструкцию UNION ALL со значениями MAX() для каждой таблицы. Если вам нужен динамический оператор, вы можете сгенерировать его, используя что-то вроде указанного выше запроса в хранимой процедуре (см. docs.snowflake.net/manuals/sql-reference/stored-procedures.html для подсказок). К сожалению, нет полностью гибкого способа получить значение результата из хранимой процедуры, например, в. запрос. - person Hans Henrik Eriksen; 08.01.2020

Раньше я использовал неаккуратный подход, когда у меня, как у разработчика, не было доступа ни к каким системным таблицам в традиционном мире РСУБД. Я использовал таблицы show, чтобы получить список всех таблиц, а затем использовал excel для создания max (date_marked_invalid)) с дополнительным столбцом псевдонима в качестве имени таблицы, а затем применил union all для построения результата.

select max(date_marked_invalid) as dt, 'table-1' as table from table-1 union all
select max(date_marked_invalid) as dt, 'table-2' as table from table-2 union all
select max(date_marked_invalid) as dt, 'table-3' as table from table-3 

Результат может выглядеть как

enter code here
dt        |  table
01-01-2020 table-1
01-02-2020 table-2

Когда у вас есть список таблиц, вы можете отформатировать все свои запросы таким образом и получить результат. Если это служебная задача, и она должна запускать задание, то здесь может помочь какой-нибудь язык сценариев или язык программирования, где выходные данные шоу-таблицы фиксируются в файле, создают такой запрос и получают результат.

Надеюсь, этот неаккуратный подход может временно помочь.

person Data Engineering Simplified    schedule 08.01.2020