PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Percentuale sul totale in PostgreSQL senza subquery

Immagino che il motivo per cui desideri eliminare la sottoquery sia evitare di scansionare due volte la tabella degli utenti. Ricorda che il totale è la somma dei conteggi per ogni paese.

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;

Questa query crea un piccolo CTE con le statistiche per paese. Analizzerà la tabella degli utenti solo una volta e genererà un piccolo set di risultati (solo una riga per paese).

Il totale (SELECT sum(cnt) FROM c) viene calcolato solo una volta su questo piccolo set di risultati, quindi utilizza un tempo trascurabile.

Potresti anche usare una funzione finestra :

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;

(che è la stessa della query di nightwolf con gli errori rimossi lol )

Entrambe le query richiedono all'incirca lo stesso tempo.