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

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

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-22 17:16:10384浏览

How Can I Simplify Aggregating Game Statistics with Distinct Filters in PostgreSQL?

使用额外(不同)过滤器聚合列

以下代码计算每个玩家玩过的、赢过的和输过的游戏次数。但是,它的长度和复杂性带来挑战。我们如何简化此查询?

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>

任何 PostgreSQL 版本

强调 PostgreSQL 9.4 引入了 FILTER 子句。对于旧版本,存在一种解决方法:

<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>

注意: 对旧版本PostgreSQL的解决方案使用了CASE语句代替FILTER子句,达到相同的效果。 这两种方法都能准确计算玩家的游戏统计数据,但FILTER子句在可读性和可维护性方面更具优势。

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

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