PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Porcentagem do total no PostgreSQL sem subconsulta


Acho que o motivo pelo qual você deseja eliminar a subconsulta é evitar a varredura da tabela de usuários duas vezes. Lembre-se que o total é a soma das contagens para cada país.
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;

Essa consulta cria um pequeno CTE com as estatísticas por país. Ele verificará a tabela de usuários apenas uma vez e gerará um pequeno conjunto de resultados (apenas uma linha por país).

O total (SELECT sum(cnt) FROM c) é calculado apenas uma vez neste pequeno conjunto de resultados, portanto, usa um tempo insignificante.

Você também pode usar uma função de janela:
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;

(que é o mesmo que a consulta do nightwolf com os erros removidos lol)

Ambas as consultas levam aproximadamente o mesmo tempo.