sql >> Databasteknik >  >> RDS >> PostgreSQL

Procent till totalt i PostgreSQL utan underfråga

Jag antar att anledningen till att du vill eliminera underfrågan är att undvika att skanna användartabellen två gånger. Kom ihåg att summan är summan av antalet för varje land.

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;

Den här frågan bygger en liten CTE med statistik per land. Den skannar bara användartabellen en gång och genererar en liten resultatuppsättning (endast en rad per land).

Summan (SELECT summa(cnt) FROM c) beräknas endast en gång på denna lilla resultatuppsättning, så den använder försumbar tid.

Du kan också använda en fönsterfunktion :

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;

(vilket är detsamma som nightwolfs fråga med felen borttagna lol )

Båda frågorna tar ungefär samma tid.



  1. Hur man distribuerar ett produktionsfärdigt MySQL- eller MariaDB Galera-kluster med ClusterControl

  2. varför kan jag inte komma åt min CTE efter att jag använt den en gång?

  3. Hur kör man python-applikationen och postgres i en dockercontainer?

  4. SQLite datum och tid