首页 > 解决方案 > 如何使用 postgresql 按多列中表示的值进行聚合

问题描述

我正在使用 postgresql 8.3.23
我有一个表,其中一个 ip 表示为 3 个不同的列。在不使用多个连接和多个查询的情况下,按 IP 聚合并按列获取总和的最佳方法是什么?

桌子

资源 反式 目的地
ip1 ip2
ip1 ip1 ip3
ip1 ip2 ip3
ip2 ip4 ip5

我想得到什么

ip 资源 反式 目的地
ip1 3 1 0
ip2 1 1 1
ip3 0 0 2
ip4 0 1 0
ip5 0 0 1

标签: sqlaggregategreenplum

解决方案


您可以取消透视并重新聚合:

select ip, sum(source), sum(trans), sum(dest)
from ((select source as ip, 1 as source, 0 as trans, 0 as dest
       from t
      ) union all
      (select trans as ip, 0 as source, 1 as trans, 0 as dest
       from t
      ) union all
      (select dest as ip, 0 as source, 0 as trans, 1 as dest
       from t
      )
     ) t
group by ip;

肯定有不同的方式来表达这个逻辑。但是谁还记得 Postgres 8.3 支持什么?


推荐阅读