Нахождение среднего значения, стандартное отклонение, процентили для всех числовых переменных в таблице - PullRequest
0 голосов
/ 21 мая 2018

У меня 30 числовых столбцов в таблице. Я хочу найти среднее, стандартное, процентили для всех столбцов в таблице. Я не хочу писать все имена столбцов вручную, как показано ниже

select date,
      avg(col1), stddev(col1),
      avg(col2), stddev(col2), 
from table name group by date;

Есть ли способ найти среднее значение, стандартное значение, процентили для всех столбцов одновременно.

Ответы [ 2 ]

0 голосов
/ 21 мая 2018

Динамический SQL - небольшая хитрость в Greenplum.

Вот пример, основанный на инструкции из https://www.pivotalguru.com/?p=266

$ psql postgres -c "create table foo (date date, c1 int, c2 int, c3 int);"
$ cat <<EOT >> /tmp/bar.sql
> select 'select ';
> select ' avg('  || attname || '), stddev(' || attname || '),' from pg_attribute
> where attrelid = 'foo'::regclass::oid and attnum > 0 and attname != 'date';
> select ' date from foo group by date;';
> EOT
$ psql -A -t  -f /tmp/foo.sql postgres | psql -a postgres
select 
 avg(c1), stddev(c1),
 avg(c2), stddev(c2),
 avg(c3), stddev(c3),
 date from foo group by date;
 avg | stddev | avg | stddev | avg | stddev | date 
-----+--------+-----+--------+-----+--------+------
0 голосов
/ 21 мая 2018

Вы можете упростить логику, используя боковое соединение:

select which, min(val), max(val), stddev(val), avg(val)
from t, lateral
     (values ('col1', col1), ('col2', col2), . . . 
     ) v(which, val)
group by which;

Вам все еще нужно перечислить столбцы, но вам нужно сделать это только один раз в предложении values.

...