#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. извините за это … должен ли я снова отредактировать вопрос и оставить его таким, каким он был? А затем откройте другой вопрос? больше не уверен. мой плохой, так что извините