Rationalisation de l'agrégation de colonnes avec des filtres distincts dans PostgreSQL
Le code suivant regroupe les données de plusieurs tables, en appliquant des filtres distincts pour catégoriser les parties jouées, gagnées et perdues. Bien que fonctionnel, sa complexité et sa longueur justifient une approche plus efficace. Cet article explore des méthodes plus simples.
Exploiter la clause FILTER
(PostgreSQL 9.4 et versions ultérieures)
PostgreSQL 9.4 et versions ultérieures proposent la clause SQL FILTER
standard, permettant un filtrage dynamique au sein des agrégations. Cela simplifie considérablement la requête :
<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>
Alternative pour les anciennes versions de PostgreSQL
Pour les versions antérieures à PostgreSQL 9.4, une solution de contournement utilisant des expressions booléennes au sein de la fonction d'agrégation est disponible :
<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>
Cette méthode, bien que moins efficace que la clause FILTER
, offre une solution pratique pour les anciennes installations PostgreSQL.
Résumé
L'utilisation de la clause FILTER
(PostgreSQL 9.4) ou de la solution de contournement booléenne fournit une solution plus concise et, dans la plupart des cas, performante. La clause FILTER
est l'approche privilégiée pour les versions plus récentes en raison de sa lisibilité et de son efficacité améliorées. Pour les anciennes versions, la solution de contournement booléenne reste une alternative viable.
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!