Вычисление для каждого элемента SQL

#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’ и дает вам количество для каждого рефальта и его процент в этом наборе.