繁体   English   中英

如何从 Redshift 中的 1 个模式中选择所有表中的最大值?

[英]how to select all columns from all tables with it's max values from 1 schema in Redshift?

我有一个包含大约 300 个表的模式,并且需要找到每个表的每一列的最大值,假设我有表“Person”,其中包含以下列:“name”、“surname”、“passport_number”和“Person_phone”表列:“phone_number”,“years_of_using”,结果应该是这样的:

桌子 柱子 最大值
姓名 马蒂斯
库西娜
护照号 999999234989
人电话 电话号码 +48930290320
人电话 使用年限 10

这是执行此操作的过程的代码。

CREATE OR REPLACE PROCEDURE max_of_all_columns(schema_name TEXT)
AS
$$
DECLARE
  ro    RECORD;
  max_r RECORD;
BEGIN
  DROP TABLE IF EXISTS tmp_xyz;
  CREATE TEMP TABLE tmp_xyz
  (
    table_name  VARCHAR(100),
    column_name VARCHAR(100),
    max_val     TEXT
  );
  
  FOR ro IN SELECT
              QUOTE_IDENT(table_name) :: VARCHAR                                 AS table_name,
              QUOTE_IDENT(column_name) :: VARCHAR                                AS column_name,
              'SELECT MAX(' || QUOTE_IDENT(column_name) || ') :: TEXT AS max_val FROM ' || QUOTE_IDENT(table_catalog) ||
              '.' || QUOTE_IDENT(table_schema) || '.' || QUOTE_IDENT(table_name) AS max_query
  FROM
    information_schema.columns c
  WHERE
    table_schema = schema_name AND data_type IN (
                                                 -- add more types if necessary
                                                 'bigint',
                                                 'character',
                                                 'character varying',
                                                 'date',
                                                 'double precision',
                                                 'integer',
                                                 'numeric',
                                                 'real',
                                                 'smallint',
                                                 'timestamp without time zone'
    )
    LOOP
      EXECUTE ro.max_query INTO max_r;
      INSERT INTO tmp_xyz(table_name, column_name, max_val)
      VALUES (ro.table_name, ro.column_name, max_r.max_val);
    END LOOP;
END
$$ LANGUAGE plpgsql;

让我们创建一些测试表。

-- create schema for testing.
CREATE SCHEMA IF NOT EXISTS trash;

-- add test tables. 
DROP TABLE IF EXISTS trash.tmp_xyz;
CREATE TABLE trash.tmp_xyz AS
SELECT 1::INT AS abc, 45::INT AS xyz UNION ALL SELECT 2::INT AS abc, 24::INT AS xyz;

DROP TABLE IF EXISTS trash.tmp_abc;
CREATE TABLE trash.tmp_abc AS
SELECT 1::INT AS abc, 'Maartin'::VARCHAR AS xyz_varchar UNION ALL SELECT 2::INT AS abc, 'Khusia'::VARCHAR AS xyz_varchar;

现在让我们执行该过程。

CALL max_of_all_columns('trash');
SELECT * FROM tmp_xyz;

结果如下:

|table_name|column_name|max_val|
+----------+-----------+-------+
|tmp_abc   |abc        |2      |
|tmp_abc   |xyz_varchar|Maartin|
|tmp_xyz   |abc        |2      |
|tmp_xyz   |xyz        |45     |
+----------+-----------+-------+

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM