Динамически транспонировать таблицу с использованием PostgresSQL - PullRequest
0 голосов
/ 27 сентября 2019

У меня есть таблица с этой схемой:

summary    |    time    |    v1    |    v2    | .... v28
---------------------------------------------------------
count      |    12345   |    3.7   |    9.8   | .... 6.8
stddev     |    23564   |    5.7   |    8.8   | .... 6.6 
min        |    12345   |    6.7   |    3.8   | .... 6.5
25%        |    12545   |    7.7   |    1.8   | .... 6.4
50%        |    13455   |    8.7   |    2.8   | .... 6.3
75%        |    32345   |    9.7   |    4.8   | .... 6.2
max        |    89045   |    1.7   |    4.9   | .... 6.1

Я хочу, чтобы результат был:

column_Name   |   count   |   count   |   stddev   |   min   |   25%   |   50%   |   75%   |   max
--------------------------------------------------------------------------------------------------------
time          |   .....   |   .....   |   .....    |  ....   |   ...   |   ...   |   ...   |    ...      
v1            |   .....   |   .....   |   .....    |  ....   |   ...   |   ...   |   ...   |    ...      
v2            |   .....   |   .....   |   .....    |  ....   |   ...   |   ...   |   ...   |    ...      
.
.
.
v28           |   .....   |   .....   |   .....    |  ....   |   ...   |   ...   |   ...   |    ...         

Я использую PostgresSQL 9.4 и DBeaver для транспонирования / поворотаэто с использованием нескольких запросов, которые я обнаружил при переполнении стека, но я получаю ошибки!Я не знаю, почему я получаю их: Query1

SELECT (each(hstore(dataset.stats.*))).* FROM dataset.stats

Получение этой ошибки:

SQL Error [1]: Query failed (#20190927_165859_00936_zga4f): line 1:77: mismatched input '*'. Expecting: <identifier>

Это запрос2:

SELECT 'SELECT *
FROM   crosstab(
       ''SELECT u.attnum, t.rn, u.val
        FROM  (SELECT row_number() OVER () AS rn, * FROM ' || attrelid::regclass || ') t
             , unnest(ARRAY[' || string_agg(quote_ident(attname) || '::text', ',') || '])
                WITH ORDINALITY u(val, attnum)
        ORDER  BY 1, 2''
   ) t (attnum int, '
     || (SELECT string_agg('r'|| rn ||' text', ',')
         FROM  (SELECT row_number() OVER () AS rn FROM tbl) t)
     || ')' AS sql
FROM   pg_attribute
WHERE  attrelid = 'dataset.stats'::regclass
AND    attnum > 0
AND    NOT attisdropped
GROUP  BY attrelid;

Получение этогоошибка:

SQL Error [1]: Query failed (#20190927_165928_00937_zga4f): line 4:63: identifiers must not contain ':'
...