PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Процент към общата сума в PostgreSQL без подзаявка

Предполагам, че причината, поради която искате да премахнете подзаявката, е да избегнете сканирането на таблицата с потребители два пъти. Не забравяйте, че общата сума е сумата от броя за всяка страна.

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;

Тази заявка изгражда малък CTE със статистическите данни за всяка страна. Той ще сканира таблицата с потребители само веднъж и ще генерира малък набор от резултати (само един ред за държава).

Общата сума (SELECT sum(cnt) FROM c) се изчислява само веднъж за този малък набор от резултати, така че използва незначително време.

Можете също така да използвате функция за прозорец:

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;

(което е същото като заявката на nightwolf с премахнати грешки хахахахахахахахахахаха!)

И двете заявки отнемат приблизително едно и също време.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да използвате вътрешни съединения с подзаявки в Laravel Eloquent

  2. грешка при инсталиране на psycopg2, библиотеката не е намерена за -lssl

  3. PostgreSQL:преобразува шестнадесетичен низ от много голямо число в ЧИСЛО

  4. извикванията на агрегатни функции на postgres може да не са вложени

  5. Разбиране на производителността на заявките на PostgreSQL