【问题标题】:aggregate columns across rows跨行聚合列
【发布时间】:2017-03-20 03:00:04
【问题描述】:

使用如下表,需要将每行的val1val4meanmedian 分别计算为val_meanval_median

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

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

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

+----+------+--------+
| id | loc  |  val   |
+----+------+--------+
|  1 | loc1 |   10   |
|  1 | loc1 |   190  |
|  1 | loc1 |   null |
|  1 | loc1 |   20   |
|  2 | loc2 |   20   |
|  2 | loc2 |   null |
|  2 | loc2 |   10   |
|  2 | loc2 |   10   |
+----+------+--------+

【问题讨论】:

  • 在计算中位数时,您希望如何处理 NULL 值?
  • NULL 需要删除(忽略)
  • 你会一直有 4 个值列,还是以后会有更多?
  • 实际数据有30个-V1到V30

标签: sql postgresql


【解决方案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

【讨论】:

    猜你喜欢
    • 2017-08-10
    • 2021-04-09
    • 1970-01-01
    • 2022-01-25
    • 2017-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-27
    相关资源
    最近更新 更多