Как я могу получить разделение двух групп на SQL?

#sql #postgresql #join

#sql #postgresql #Присоединиться

Вопрос:

Я видел несколько сообщений, чтобы получить процент от каждой строки (используя partition by), другие о разделении одной строки на другую (используя inner join с той же таблицей), но я не вижу этой проблемы, поэтому я надеюсь, что этот пост не является проблемой.

У меня есть следующая таблица:

 week            group      ID
2020-01-07      A          AUR1282
2020-01-07      A          BSF9382
2020-01-07      A          EOA9284
2020-01-07      B          AIF3984
2020-01-21      A          AIG3856
2020-01-21      B          PRT3950
  

И я хочу получить процент идентификаторов в группе A. Результат должен быть таким:

 group      ID_perc
A          0.66
  

Это должно быть довольно просто. Но я зашел так далеко:

 select t1.week, count(distinct t1.ID)::float/t2.total_ID as ID_perc
from table as A
inner joint (select count(distinct ID) as total_ID 
            from table where group='B') t2
on t1.week = t2.week
where t1.group = 'A'
  

Это не решает мою проблему.

Есть мысли?

Заранее спасибо

Комментарии:

1. Что касается последнего изменения, как вы получаете 66% для всей группы «A»?

2. У меня есть четыре случая для группы А и два для группы В. Итак, 4/(4 2) =0.66

Ответ №1:

Вы можете использовать это (на основе вашего последнего редактирования) —

  Select group, grp_count/total_cnt as perc
 from
 (Select group,count(*) as grp_count, min(total_cnt) as total_cnt
 from t
Cross Join (Select count(*) as total_cnt from t) t2
Group by group)
  

Ответ №2:

Кажется, ты хочешь:

 select week, 'A' as grp,
       (count(*) filter (where group = 'A') * 1.0) / count(*)
from t
group by week;
  

Или альтернативно:

 select week, 'A' as grp,
       avg( (group = 'A')::int )
from t
group by week;
  

Комментарии:

1. черт, я запросил что-то отличное от того, что я действительно хотел. Процент по неделям у меня уже есть (как я опубликовал). Что мне было нужно, так это процент для всей таблицы. Я отредактировал вопрос, но я думаю, что я не должен этого делать, верно?

2. извините за это … должен ли я снова отредактировать вопрос и оставить его таким, каким он был? А затем откройте другой вопрос? больше не уверен. мой плохой, так что извините