#sql #data-manipulation #postgresql-9.5
#sql #обработка данных #postgresql-9.5
Вопрос:
Мне нужно выполнить вычисление для моего набора данных, которое является простым:
refalt
AA
AT
AC
...
Я использую этот оператор SQL для извлечения моей информации:
select
refalt,
count(*) as Total,
((
select
count(*)
from ft_variant
where refalt IN ('AC','AT', 'AA')
)::numeric --Number of times that a couple is in
/
(
select count(*)
from ft_variant
))as Frequency --Divided by total umber of elements
from ft_variant
group by refa<
Мой результат довольно хорош, за исключением одной вещи:
Refalt Total Frequency
AC 131682 0.12
AT 149385 0.12
AA 55841 0.12
Частота относится только к AA, я хочу рассчитать частоту для каждой пары.
Результат должен быть:
Refalt Total Frequency
AC 131682 0.20
AT 149385 0.68
AA 55841 0.12
Что-то не так, я не могу понять это.
Ответ №1:
Вы все усложняете:
select refalt,
count(*) as total,
count(*)::numeric / (select count(*) from ft_variant) as frequency
from ft_variant
group by refalt
Если вы хотите ограничить это только 'AC','AT', 'AA'
тем, что вы можете добавить это в where
предложение.
Ответ №2:
Вы подсчитываете процентное соотношение ‘AC’ ‘AT’ ‘AA’ в таблице. Вы хотите посчитать процент от одного рефальта, который вы показываете вместо этого.
Вероятно:
select
refalt,
count(*) as total,
count(*)::numeric / sum(count(*)) over () as frequency
from ft_variant
where refalt in ('AC', 'AT', 'AA')
group by refa<
Это просматривает только записи ‘AC’, ‘AT’ и ‘AA’ и дает вам количество для каждого рефальта и его процент в этом наборе.