跨行聚合列

时间:2017-03-20 03:00:04

标签: sql postgresql

如下表所示,需要为mean和{{1}计算每行medianval1val4的{​​{1}}和val_mean } 分别。

val_median

一般来说,我们如何处理跨列的聚合?

一种方法可以是将val1分解为val4到4个不同的行,然后通过id,loc聚合它们以找到平均值/中值。所以上面的表格首先需要转换成下面的格式 - 我怎么可能会这样做?

+----+------+------+------+------+------+
| id | loc  | val1 | val2 | val3 | val4 |
+----+------+------+------+------+------+
|  1 | loc1 |   10 | 190  | null |   20 |
|  2 | loc2 |   20 | null | 10   |   10 |
+----+------+------+------+------+------+

1 个答案:

答案 0 :(得分:1)

select id, loc, avg(val), percentile_disc(0.5) within group (order by val)
from (
  select id, loc, val1 as val
  from t
  union all
  select id, loc, val2
  from t
  union all
  select id, loc, val3
  from t
  union all
  select id, loc, val4
  from t
) s
group by id, loc
;
 id | loc  |         avg         | percentile_disc 
----+------+---------------------+-----------------
  1 | loc1 | 73.3333333333333333 |              20
  2 | loc2 | 13.3333333333333333 |              10