Postgres находит максимальное значение столбца из нескольких таблиц - PullRequest
0 голосов
/ 08 января 2019

У меня есть список таблиц с конкретными именами столбцов, например

SELECT table_name
FROM information_schema.columns
WHERE column_name = 'column1'

Мне нужно найти максимальное значение column1 для каждой таблицы. Я ожидаю результат, подобный следующему

|--------|--------------|
| Table  |  Max column1 |
|--------|--------------|
| Table1 |     100      |
| Table2 |     200      |
|  ...   |     ...      |
|--------|--------------|

Как я могу построить запрос?

Ответы [ 2 ]

0 голосов
/ 08 января 2019

Вы можете создать универсальную функцию, которая возвращает тип TABLE, создав запрос UNION ALL из information_schema.columns

CREATE OR REPLACE FUNCTION public.get_max(TEXT )
RETURNS  TABLE(t_table_name  TEXT, t_max text )
LANGUAGE plpgsql
AS $BODY$
DECLARE
p_colname        TEXT := $1;
v_sql_statement TEXT;

BEGIN

SELECT STRING_AGG( 'SELECT '''||table_name||''','||' MAX('
       || column_name||'::text'
       || ')  FROM '
       || table_name 
         ,' UNION ALL ' ) INTO v_sql_statement
FROM   information_schema.columns 
WHERE  column_name = p_colname 
      --and table_schema = 'public';

    IF v_sql_statement IS NOT NULL THEN
       RETURN QUERY EXECUTE  v_sql_statement;
    END IF;
END
$BODY$;

Выполните и получите такие результаты.

knayak=# select * FROM get_max('id');
 t_table_name | t_max
--------------+-------
 f            | 2
 t2           | 1
 friends      | id4
 person       | 2
 customer     |
 employe      |
 diary        | 4
 jsontable    | 6
 atable       |
 t_json       | 2
 ingredients  | 1
 test         | 2
 accts        |
 mytable      | 30
(14 rows)
0 голосов
/ 08 января 2019

Вы можете использовать вариацию количества строк для всех таблиц подход:

select t.table_name, 
       (xpath('/row/max/text()', xmax))[1]::text::int
from (
  SELECT table_name, data_type, 
         query_to_xml(format('select max(%I) from %I.%I', column_name, table_schema, table_name), true, true, '') as xmax
  FROM information_schema.columns
  WHERE column_name = 'column1'
    and table_schema = 'public'
) as t;

query_to_xml() запускает select max(..) from .. для каждого столбца, возвращаемого запросом. В результате получается что-то вроде:

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <max>42</max>
</row>

Функция xpath() затем используется для извлечения значения из XML. Производная таблица (подзапрос) на самом деле не нужна, но делает выражение xpath() более читабельным (на мой взгляд).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...