sql >> Database >  >> RDS >> PostgreSQL

Percentage tot totaal in PostgreSQL zonder subquery

Ik denk dat de reden dat u de subquery wilt verwijderen, is om te voorkomen dat u de gebruikerstabel twee keer scant. Onthoud dat het totaal de som is van de tellingen voor elk 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;

Deze query bouwt een kleine CTE op met de statistieken per land. Het scant de gebruikerstabel slechts één keer en genereert een kleine resultatenset (slechts één rij per land).

Het totaal (SELECT sum(cnt) FROM c) wordt slechts één keer berekend voor deze kleine resultatenset, dus het kost verwaarloosbare tijd.

U kunt ook een vensterfunctie gebruiken:

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;

(wat hetzelfde is als de vraag van Nightwolf met de fouten verwijderd lol )

Beide zoekopdrachten duren ongeveer even lang.



  1. Paragraaf tekst opslaan in mysql

  2. Verbinding maken met SQL Server-instantie met behulp van Windows-verificatie of SQL Server-verificatie - SQL Server / T-SQL-zelfstudie, deel 3

  3. Hoe laadt uw Oracle ODBC-stuurprogramma de Oracle-client?

  4. SQL Server 2008 naar SQL Server 2005