SQL - вычислить процент по счету (столбец)

У меня есть следующий фрагмент кода, который подсчитывает, сколько раз что-то появляется в столбце событий.

SELECT event, count(event) as event_count   
FROM event_information
group by event

event   event_count
a       34
b       256
c       45
d       117
e       3

Я хочу иметь возможность рассчитать процент каждой из строк, например так.

event   event_count event_percent
a       34          7.47
b       256         56.26
c       45          9.89
d       117         25.71
e       3           0.66

person Dean Flaherty    schedule 18.05.2016    source источник
comment
Какую базу данных вы используете?   -  person sgeddes    schedule 18.05.2016
comment
получить общее количество событий и сохранить в переменной. используйте эту переменную в исходном операторе выбора   -  person austin wernli    schedule 18.05.2016


Ответы (2)


Большинство диалектов SQL поддерживают стандартные оконные функции ANSI. Таким образом, вы можете написать запрос как:

select event, count(*) as event_count,
       count(*) * 100.0/ sum(count(*)) over () as event_percent
from event_information
group by event;

Оконные функции обычно более эффективны, чем подзапросы и другие методы.

person Gordon Linoff    schedule 18.05.2016
comment
Я никогда не видел такого синтаксиса - и он решает точную проблему гораздо более элегантным способом, поскольку он учитывает любые предложения, заложенные в основном WHERE. - person igorsantos07; 05.03.2021

person    schedule
comment
Это работает хорошо, пока я не укажу диапазон дат в предложении where. Вычисляемый процент рассчитывается на основе всего набора данных, а не только диапазона дат. Как вы можете себе представить, это делает все проценты очень маленькими, поскольку event_count ниже. - person Dean Flaherty; 19.05.2016
comment
Просто добавьте то же предложение where во внутренний выбор. - person juergen d; 19.05.2016
comment
@juergen Не будет ли это слишком сложным в вычислительном отношении для больших наборов данных? - person Ali; 24.03.2019
comment
@Ali: я не думаю, что это проблема с правильно проиндексированными таблицами. - person juergen d; 24.03.2019