SQL: сгруппировать по количеству (*) в процентах от общего числа строк таблицы - PullRequest
6 голосов
/ 04 ноября 2011

Я потратил много времени на поиск этого, пожалуйста, дайте мне знать, если есть дубликаты.

Мне нужно написать групповой запрос, который возвращает категории записей со счетчиком категории каждого типа.Примерно так:

select categorynum, count(*) from tbl group by categorynum;

Пока все хорошо.Теперь мне нужно определить, какой% от общего количества каждой категории занимает.Лучшее, что я придумала, это то, что мне не нравится, оно кажется грязным:

select categorynum, count(*), count(*)/(select count(*) from tbl) from tbl group by categorynum;

Это работает, но меня это так раздражает.База данных, которую я использую, совместима с синтаксисом Postgres, и count(*) для таблицы действительно быстрая, поэтому при выполнении count(*) для таблицы нет большой скорости, хотя я хотел бы написать лучший SQL, если это возможно.

Так есть ли лучший способ написать это?Я часто сталкиваюсь с такой ситуацией, поэтому я хотел бы правильно написать свои запросы.

Ответы [ 2 ]

5 голосов
/ 04 ноября 2011

Поскольку PostgreSQL поддерживает оконные функции, вы можете сделать что-то вроде этого:

select categorynum,count,100*count/(sum(count) over ())::numeric as count_pct
from(
    select categorynum,count(1)
    from tbl
    group by categorynum
)a;
1 голос
/ 04 ноября 2011

Вы также можете выполнить подсчет (*) для таблицы как отдельный запрос, а затем объединить его с исходным запросом в части FROM вашего оператора SELECT. Это должно быть быстрее, чем поместить его в часть SELECT.

select categorynum, categorycount, total
from (select categorynum, count(*) as categorycount
      from tbl
      group by categorynum) categories,
     (select count(*) as total from tbl) totals
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...