Maison > base de données > tutoriel mysql > Comment effectuer efficacement des décomptes conditionnels dans PostgreSQL à l'aide des instructions CASE, FILTER ou Crosstab() ?

Comment effectuer efficacement des décomptes conditionnels dans PostgreSQL à l'aide des instructions CASE, FILTER ou Crosstab() ?

DDD
Libérer: 2025-01-24 06:16:13
original
119 Les gens l'ont consulté

How to Efficiently Perform Conditional Counts in PostgreSQL Using CASE Statements, FILTER, or Crosstab()?

Comptage de conditions PostgreSQL : comparaison d'efficacité entre l'instruction CASE et FILTER

La fréquence d'apparition des données dans des tableaux statistiques efficaces est cruciale. PostgreSQL utilise généralement l'instruction CASE pour le comptage conditionnel, mais cette méthode devient fastidieuse lorsque le nombre de valeurs possibles augmente.

Utilisez SUM(CASE WHEN) pour compter :

<code class="language-sql">SELECT
    sum(CASE WHEN question1 = 0 THEN 1 ELSE 0 END) AS ZERO,
    sum(CASE WHEN question1 = 1 THEN 1 ELSE 0 END) AS ONE,
    sum(CASE WHEN question1 = 2 THEN 1 ELSE 0 END) AS TWO,
    category
FROM reviews
GROUP BY category</code>
Copier après la connexion

Utilisez COUNT(CASE WHEN) pour compter :

<code class="language-sql">SELECT
    count(CASE WHEN question1 = 0 THEN 1 END) AS ZERO,
    count(CASE WHEN question1 = 1 THEN 1 END) AS ONE,
    count(CASE WHEN question1 = 2 THEN 1 END) AS TWO,
    category
FROM reviews
GROUP BY category</code>
Copier après la connexion

Limitations de l'instruction CASE :

Bien que ces méthodes puissent implémenter un comptage conditionnel, elles présentent des inconvénients :

  • Code long : l'écriture de plusieurs instructions CASE est sujette aux erreurs et inefficace.
  • Problème de performances : l'utilisation d'expressions CASE et ELSE 0 peut affecter les performances.

Utilisez FILTER pour optimiser le comptage dans la version PostgreSQL 9.4 :

Pour PostgreSQL 9.4 et supérieur, l'option d'agrégation FILTER fournit une solution efficace :

<code class="language-sql">SELECT category
     , count(*) FILTER (WHERE question1 = 0) AS zero
     , count(*) FILTER (WHERE question1 = 1) AS one
     , count(*) FILTER (WHERE question1 = 2) AS two
FROM   reviews
GROUP  BY 1;</code>
Copier après la connexion

Cette méthode utilise la clause FILTER pour appliquer différents filtres, évitant ainsi la surcharge des instructions CASE supplémentaires.

Utilisez OR NULL pour simplifier la syntaxe :

Pour plus de concision, vous pouvez utiliser OR NULL :

<code class="language-sql">SELECT category
     , count(question1 = 0 OR NULL) AS zero
     , count(question1 = 1 OR NULL) AS one
     , count(question1 = 2 OR NULL) AS two
FROM   reviews
GROUP  BY 1;</code>
Copier après la connexion

Requête croisée pour les décomptes complexes :

La fonction crosstab() offre les meilleures performances et simplicité lorsqu'il s'agit de traiter un grand nombre d'options :

<code class="language-sql">SELECT * FROM crosstab(
     'SELECT category, question1, count(*) AS ct
      FROM   reviews
      GROUP  BY 1, 2
      ORDER  BY 1, 2'
   , 'VALUES (0), (1), (2)'
   ) AS ct (category text, zero int, one int, two int);</code>
Copier après la connexion

En bref, l'option FILTER de PostgreSQL et la syntaxe OR NULL fournissent des méthodes efficaces et pratiques pour le comptage conditionnel, et la fonction crosstab() fonctionne bien dans les scénarios de comptage complexes.

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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal