sql - 如何使用 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 |
解决方案
您可以取消透视并重新聚合:
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 支持什么?
推荐阅读
- shell - Rsync:如何排除文件夹中除一个特定文件之外的所有文件?
- python - 表单清理方法 vs 模型清理方法 vs 模型字段验证器
- c++ - 如何检查 std::vector 的调整大小是否获得了适当的内存
- python - 有没有办法将 RASA_NLU 配置从 Visual c++ 14.0 更改为 MinGW
- laravel - Laravel - belongsTo 关系的条件
- javascript - 在 Windows 上滚动在最近的选择器上添加类
- django - 'using' 是此函数的无效关键字参数 (serializer.save(using='tableNew'))
- asp.net - ASP.NET Core Web API 如何临时保存已验证的电话号码
- python - 按列任意排序矩阵
- javascript - 画布绘图在放大/缩小时消失