PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Procent sumy w PostgreSQL bez podzapytania

Myślę, że powodem, dla którego chcesz wyeliminować podzapytanie, jest uniknięcie dwukrotnego skanowania tabeli użytkowników. Pamiętaj, że suma jest sumą zliczeń dla każdego kraju.

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;

To zapytanie tworzy mały CTE ze statystykami dla poszczególnych krajów. Przeskanuje tabelę użytkowników tylko raz i wygeneruje mały zestaw wyników (tylko jeden wiersz na kraj).

Suma (SELECT sum(cnt) FROM c) jest obliczana tylko raz na tym małym zestawie wyników, więc wykorzystuje nieistotny czas.

Możesz także użyć funkcji 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 jest takie samo jak zapytanie nightwolf z usuniętymi błędami lol )

Oba zapytania zajmują mniej więcej ten sam czas.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dialekt musi być wyraźnie podany od wersji 4.0.0

  2. Postgres tworzy błąd rozszerzenia POSTGIS w CentOS 6

  3. Jaki jest odpowiednik LITAGG (bazy danych Oracle) w PostgreSQL?

  4. Co dzieje się z duplikatami podczas wstawiania wielu wierszy?

  5. Używanie dwufazowych zatwierdzeń na postgres