Maison > base de données > tutoriel mysql > Comment puis-je agréger efficacement des colonnes avec des filtres distincts dans PostgreSQL ?

Comment puis-je agréger efficacement des colonnes avec des filtres distincts dans PostgreSQL ?

Barbara Streisand
Libérer: 2025-01-22 17:11:38
original
780 Les gens l'ont consulté

How Can I Efficiently Aggregate Columns with Distinct Filters in PostgreSQL?

Colonne d'agrégation efficace PostgreSQL et filtre distinct

Le code suivant récupère les données de trois colonnes agrégées distinctes : parties jouées, parties gagnées et parties perdues. Bien que ce code fonctionne comme prévu, il est répétitif et potentiellement difficile à maintenir. Pour simplifier cette requête, envisagez d'utiliser les fonctionnalités avancées de PostgreSQL.

PostgreSQL 9.4 et supérieur

PostgreSQL 9.4 introduit une nouvelle clause d'agrégation FILTER. Cette clause vous permet d'appliquer un filtre à un calcul agrégé, en considérant uniquement les lignes qui satisfont à l'expression booléenne spécifiée.

<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>
Copier après la connexion

Versions PostgreSQL antérieures à 9.4

Pour les versions antérieures de PostgreSQL, vous pouvez utiliser une expression (expression OU NULL) comme solution de contournement.

<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>
Copier après la connexion

Cette solution de contournement est plus courte et plus rapide que l'utilisation de sous-sélections imbriquées ou d'expressions CASE. Pour d’autres considérations d’optimisation, consultez les références mentionnées dans les réponses fournies.

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal