Никогда не используйте запятые в предложении FROM
. Всегда используйте правильный, явный, стандартный JOIN
синтаксис.
Вам нужно дважды агрегировать или использовать оконную функцию.
Я бы порекомендовал:
select subject_name, topic_name, problem_type,
count(*) as num_problems,
average ,
stddev( pa.duration ),
sum(case when pa_duration < average then 1 else 0 end) as num_less_than_average
from (select tm.subject_name, tm.topic_name, pm.problem_type,
avg( pa.duration ) over (partition by tm.subject_name, tm.topic_name, pm.problem_type) as average
from problem_attempt pa join
problem_master pm
on pa.problem_id = pm.id
topic_master tm
on pm.topic_id = tm.id
where pa.outcome = 'Solved' and
pa.duration > 10 and
pa.duration < 1000 and
pm.problem_type = 'SCA'
) x
group by subject_name, topic_name, problem_type, average ;