PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Prozent zum Gesamtwert in PostgreSQL ohne Unterabfrage

Ich denke, der Grund, warum Sie die Unterabfrage eliminieren möchten, besteht darin, zu vermeiden, dass die Benutzertabelle zweimal gescannt wird. Denken Sie daran, dass die Summe die Summe der Zählungen für jedes Land ist.

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;

Diese Abfrage erstellt einen kleinen CTE mit den Statistiken pro Land. Es scannt die Benutzertabelle nur einmal und generiert eine kleine Ergebnismenge (nur eine Zeile pro Land).

Die Summe (SELECT sum(cnt) FROM c) wird nur einmal für diese kleine Ergebnismenge berechnet, sodass sie vernachlässigbar viel Zeit in Anspruch nimmt.

Sie könnten auch eine Fensterfunktion verwenden :

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;

(Das ist dasselbe wie die Abfrage von Nightwolf, bei der die Fehler entfernt wurden, lol )

Beide Abfragen dauern ungefähr gleich lang.