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

Procent til total i PostgreSQL uden underforespørgsel

Jeg gætter på, at grunden til, at du vil fjerne underforespørgslen, er for at undgå at scanne brugertabellen to gange. Husk at totalen er summen af ​​tællingerne for hvert 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;

Denne forespørgsel bygger en lille CTE med statistikken pr. land. Den scanner kun brugertabellen én gang og genererer et lille resultatsæt (kun én række pr. land).

Totalen (SELECT sum(cnt) FROM c) beregnes kun én gang på dette lille resultatsæt, så det bruger ubetydelig tid.

Du kan også bruge en vinduesfunktion :

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;
 

(hvilket er det samme som nightwolfs forespørgsel med fejlene fjernet lol )

Begge forespørgsler tager omtrent samme tid.



  1. Easysoft frigiver ODBC-ODBC Bridge til Windows 10

  2. PHP MYSQL <?php echo $row[$variable]; ?>

  3. Oprettelse af en PostgreSQL-bruger og tilføjelse af dem til en database

  4. Er det muligt at bruge MySql assignment operator (:=) i en MySqlCommand?