SQL - Нахождение процента населения между 0 и средним населением - PullRequest
0 голосов
/ 20 апреля 2019

Я пытаюсь найти процент населения для каждой сгруппированной строки между 0 и средним по этой группе.Например, в приведенном ниже запросе, скажем, у меня есть строка, в которой num_problems равно 100, а среднее значение равно 70. В совокупности имеется 58 значений (для этой строки) со значениями ниже 70. Я хочу извлечь значение (58) какчасть результата кортежа.

select
    tm.subject_name,
    tm.topic_name,
    pm.problem_type,
    count( pa.id ) as num_problems,
    avg( pa.duration ) as average ,
    stddev( pa.duration )
from
    problem_attempt pa,
    problem_master pm,
    topic_master tm
where
    pa.problem_id = pm.id and
    pm.topic_id = tm.id and
    pa.outcome = 'Solved' and
    pa.duration > 10 and 
    pa.duration < 1000 and
    pm.problem_type = 'SCA'
group by
    tm.subject_name,
    tm.topic_name,
    pm.problem_type ;

1 Ответ

0 голосов
/ 20 апреля 2019

Никогда не используйте запятые в предложении 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 ;
...