Maison >base de données >tutoriel mysql >Comment puis-je simplifier l'agrégation des statistiques de jeu avec des filtres distincts dans PostgreSQL ?

Comment puis-je simplifier l'agrégation des statistiques de jeu avec des filtres distincts dans PostgreSQL ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2025-01-22 17:16:10420parcourir

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

Agrégation de colonnes à l'aide de filtres supplémentaires (différents)

Le code suivant compte le nombre de parties jouées, gagnées et perdues par chaque joueur. Cependant, sa longueur et sa complexité posent des problèmes. Comment pouvons-nous simplifier cette requête ?

PostgreSQL 9.4 ou supérieur

Utilisez la clause FILTER pour filtrer les agrégations en fonction d'une expression booléenne :

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

Toute version de PostgreSQL

Emphase PostgreSQL 9.4 a introduit la clause FILTER. Pour les anciennes versions, une solution de contournement existe :

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

Remarque : La solution pour les anciennes versions de PostgreSQL utilise l'instruction CASE au lieu de la clause FILTER pour obtenir le même effet. Les deux méthodes calculent avec précision les statistiques de jeu d'un joueur, mais la clause FILTER a l'avantage d'être plus lisible et maintenable.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn