首頁 > 資料庫 > mysql教程 > 如何在 PostgreSQL 中使用不同的篩選器有效聚合遊戲統計資料?

如何在 PostgreSQL 中使用不同的篩選器有效聚合遊戲統計資料?

DDD
發布: 2025-01-22 17:32:41
原創
604 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板