首页 > 数据库 > mysql教程 > 如何在 PostgreSQL 中使用不同的过滤器简化聚合列?

如何在 PostgreSQL 中使用不同的过滤器简化聚合列?

Linda Hamilton
发布: 2025-01-22 17:26:10
原创
884 人浏览过

How Can I Simplify Aggregating Columns with Distinct Filters in PostgreSQL?

在 PostgreSQL 中使用不同的过滤器简化列聚合

以下代码聚合来自多个表的数据,应用不同的过滤器对已玩、获胜和失败的游戏进行分类。虽然功能强大,但其复杂性和长度保证了更有效的方法。本文探讨了更简单的方法。

利用 FILTER 子句(PostgreSQL 9.4 及更高版本)

PostgreSQL 9.4 及后续版本提供标准 SQL FILTER 子句,支持聚合内的动态过滤。这显着简化了查询:

<code class="language-sql">SELECT u.name,
       COUNT(*) FILTER (WHERE g.winner_id > 0) AS played,
       COUNT(*) FILTER (WHERE g.winner_id = u.id) AS won,
       COUNT(*) FILTER (WHERE g.winner_id <> u.id) AS lost
FROM games g
JOIN users u ON u.id IN (g.player_1_id, g.player_2_id)
GROUP BY u.name;</code>
登录后复制

旧 PostgreSQL 版本的替代品

对于 PostgreSQL 9.4 之前的版本,可以使用在聚合函数中使用布尔表达式的解决方法:

<code class="language-sql">SELECT u.name,
       COUNT(g.winner_id > 0 OR NULL) AS played,
       COUNT(g.winner_id = u.id OR NULL) AS won,
       COUNT(g.winner_id <> u.id OR NULL) AS lost
FROM games g
JOIN users u ON u.id IN (g.player_1_id, g.player_2_id)
GROUP BY u.name;</code>
登录后复制

此方法虽然效率低于 FILTER 子句,但为较旧的 PostgreSQL 安装提供了实用的解决方案。

总结

使用 FILTER 子句 (PostgreSQL 9.4 ) 或布尔解决方法提供了更简洁且在大多数情况下性能更高的解决方案。 FILTER 子句是新版本的首选方法,因为它提高了可读性和效率。 对于旧版本,布尔解决方法仍然是一个可行的替代方案。

以上是如何在 PostgreSQL 中使用不同的过滤器简化聚合列?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板