PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Pourcentage du total dans PostgreSQL sans sous-requête

Je suppose que la raison pour laquelle vous souhaitez éliminer la sous-requête est d'éviter d'analyser deux fois la table des utilisateurs. Rappelez-vous que le total est la somme des décomptes pour chaque pays.

WITH c AS (
  SELECT
    country_id,
    count(*) AS cnt
  FROM users
  WHERE cond1=...
  GROUP BY country_id
) 
SELECT
  *,
  100.0 * cnt / (SELECT sum(cnt) FROM c) AS percent
FROM c;

Cette requête construit un petit CTE avec les statistiques par pays. Il n'analysera la table des utilisateurs qu'une seule fois et générera un petit ensemble de résultats (une seule ligne par pays).

Le total (SELECT sum(cnt) FROM c) est calculé une seule fois sur ce petit ensemble de résultats, il utilise donc un temps négligeable.

Vous pouvez aussi utiliser une fonction fenêtre :

SELECT
  country_id,
  cnt,
  100.0 * cnt / (sum(cnt) OVER ()) AS percent 
FROM (
  SELECT country_id, count(*) as cnt from users group by country_id
) foo;

(qui est la même que la requête de nightwolf avec les erreurs supprimées lol )

Les deux requêtes prennent à peu près le même temps.