数据库中所有表的聚合

Aggregation for all tables in DB

我数据库中的所有 table 都包含相同的列,称之为 date_marked_invalid。我想在此列中找到所有 table 的 MAX()。有没有办法获得这些而不必 运行

SELECT MAX(date_marked_invalid) FROM one_particular_table

每个人分开 table?

对于 Postgres 可以做到这一点,但据我所知,这在 Snowflake 上不起作用。

所有列的 MIN/MAX 值都存储在每个 table 的元数据中,但不幸的是在例如中无法访问。 INFORMATION_SCHEMA.COLUMNS.

如果您创建一个存储过程来迭代 INFORMATION_SCHEMA.COLUMNS 中的 table,它仍然是一个 "metadata only" 操作,但必须手动完成。

Snowflake 没有任何函数可以 运行 动态 SQL 像 Postgres 的 query_to_xml()

动态生成聚合语句的查询将在

行中
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;

我过去使用了一种不整洁的方法,作为一名开发人员,我无法访问传统 RDBMS 世界中的任何系统 table。我使用 show tables 获取所有 tables 的列表,然后使用 excel 生成 max(date_marked_invalid)) 以及一个额外的别名列作为 table 名称,然后应用 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

获得 table 的列表后,您可以像这样格式化所有查询并获得结果。如果这是一个工作任务并且应该 运行 一个工作,那么一些脚本语言或编程语言可以在这里提供帮助,其中 show table 输出被捕获在一个文件中,构建这样的查询并获得结果。

我希望这种不整洁的方法可能会暂时有所帮助。