查找表中所有数字变量的均值,标准差,百分位数

时间:2018-05-21 01:57:25

标签: sql postgresql stored-procedures plpgsql greenplum

我在表格中有30个数字数字列。我想查找表格中所有列的平均值,标准值,百分位数。我不想手动编写所有列名称,如下所示

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

有没有办法一次找到所有列的平均值,标准值,百分位数。

2 个答案:

答案 0 :(得分:1)

您可以使用横向连接简化逻辑:

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子句中执行此操作。

答案 1 :(得分:0)

动态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 
-----+--------+-----+--------+-----+--------+------