sql >> Base de Datos >  >> RDS >> PostgreSQL

Porcentaje del total en PostgreSQL sin subconsulta

Supongo que la razón por la que desea eliminar la subconsulta es evitar escanear la tabla de usuarios dos veces. Recuerde que el total es la suma de las cuentas de 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;

Esta consulta genera un pequeño CTE con las estadísticas por país. Solo escaneará la tabla de usuarios una vez y generará un pequeño conjunto de resultados (solo una fila por país).

El total (SELECT sum(cnt) FROM c) se calcula solo una vez en este pequeño conjunto de resultados, por lo que utiliza un tiempo insignificante.

También podría usar una función de ventana:

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 es lo mismo que la consulta de nightwolf con los errores eliminados lol)

Ambas consultas toman aproximadamente el mismo tiempo.