[英]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.