首页 >数据库 >mysql教程 >如何在 PostgreSQL 中使用不同的过滤器有效聚合游戏统计数据?

如何在 PostgreSQL 中使用不同的过滤器有效聚合游戏统计数据?

DDD
DDD原创
2025-01-22 17:32:41608浏览

How Can I Efficiently Aggregate Game Statistics with Distinct Filters in PostgreSQL?

简化 PostgreSQL 中的游戏统计聚合

聚合游戏统计数据的原始代码过于复杂。这种修改后的方法简化了检索玩家姓名及其游戏计数(玩过、赢了和输了)的过程。

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

PostgreSQL 9.4 及更高版本使用 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>

FILTER 子句有效地将条件应用于聚合函数,从而提高可读性和性能。

PostgreSQL 所有版本(解决方法)

对于缺少 FILTER 子句的较旧 PostgreSQL 版本,此解决方法可实现相同的结果:

<code class="language-sql">SELECT u.name,
       COUNT(CASE WHEN g.winner_id > 0 THEN 1 END) AS played,
       COUNT(CASE WHEN g.winner_id = u.id THEN 1 END) AS won,
       COUNT(CASE WHEN g.winner_id != u.id THEN 1 END) 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>

此方法使用带有 CASE 语句的条件聚合来实现所需的过滤。 虽然在所有版本中都有效,但 FILTER 子句(如果可用)是清晰和高效的首选方法。

以上是如何在 PostgreSQL 中使用不同的过滤器有效聚合游戏统计数据?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn