sql >> Databáze >  >> RDS >> PostgreSQL

Procento k součtu v PostgreSQL bez poddotazu

Myslím, že důvodem, proč chcete odstranit poddotaz, je vyhnout se dvakrát skenování tabulky uživatelů. Pamatujte, že součet je součet počtů pro každou zemi.

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;

Tento dotaz vytváří malý CTE se statistikami pro jednotlivé země. Ta prohledá tabulku uživatelů pouze jednou a vygeneruje malou sadu výsledků (pouze jeden řádek na zemi).

Součet (SELECT sum(cnt) FROM c) se na této malé množině výsledků vypočítá pouze jednou, takže zabere zanedbatelný čas.

Můžete také použít funkci okna :

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;

(což je stejné jako dotaz nightwolf s odstraněnými chybami lol )

Oba dotazy trvají přibližně stejně dlouho.



  1. Můžete automaticky vytvořit soubor mysqldump, který nevynucuje omezení cizího klíče?

  2. Načtení hodnoty JCombobox z My Sql

  3. Typ sloupce MySQL TIMESTAMP implicitně zahrnuje NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

  4. Jak používat matematické rovnice jako filtry v SQLAlchemy