Среднее значение переменной на основе группировки частот другой переменной (SQL) - PullRequest
0 голосов
/ 20 сентября 2018

У меня есть набор данных, который содержит переменную enum (скажем, School Name), для которой я хочу создать произвольное распределение числа, и еще одну непрерывную переменную (скажем, тестовую оценку), которую я хотел бы включить ванализ, основанный на произвольном группировании.

Например:

school_name  test_score  student_id
washington      97         11112
adams           99         11113
jefferson       78         11114
washington      85         11115
washington      88         11116
monroe          75         11117
monroe          77         11118
monroe          68         11119

Я хотел бы найти среднюю оценку теста на основе размера школ (например, малых, средних и крупных школ)) - в идеале в одном запросе .

У меня нет данных о количестве учеников в школе в моих данных, поэтому мне нужно создать это путем группировки по названию школы и произвольного создания сегментов(например, в маленьких школах <100 учеников, в медицинских школах 101-500 и т. д.). </p>

Идеальный результат будет выглядеть так:

School_size  Avg_score
Small         87
Med           89
Large         88

Большое спасибо за ваши мысли!

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Вы можете сделать это

 SELECT SCHOOLSIZE,AVG(test_score) FROM TABLE T
   JOIN 
   (
     SELECT SCHOOLNAME,
            CASE WHEN  COUNT(1) < 100 THEN 'SMALL' 
                 WHEN  COUNT(1) BETWEEN 101 AND 500 THEN 'MED'
            END AS SCHOOLSIZE
     FROM TABLE 
     GROUP BY SCHOOLNAME
   ) AS S 
 ON S.SCHOOLNAME = T.SCHOOLNAME
 GROUP SCHOOLSIZE
0 голосов
/ 20 сентября 2018

Вы можете сделать это, используя два уровня агрегации.Если я правильно понимаю:

SELECT (CASE WHEN cnt < 100 THEN 'small' 
             WHEN cnt < 500 THEN 'medium'
             ELSE 'Large'   
        END) as School_size,
       SUM(sum_score) / SUM(cnt) asAvg_score
FROM (SELECT school_name,count(*) as cnt,
             SUM(test_score) as sum_score
      FROM t
      GROUP BY school_name  
     ) s
GROUP BY school_size;

Я почти уверен, что любое решение требует двух уровней агрегации.Поэтому я думаю, что это, вероятно, самое быстрое решение.

0 голосов
/ 20 сентября 2018

Вы можете попытаться получить сумму ученика на school_name в подзапросе, а затем использовать CASE WHEN, чтобы разделить размер школы и получить Avg_score.

SELECT 
    (CASE WHEN cnt <100 then 'small' 
         WHEN cnt between 101 and 500 then 'Med'
         ELSE 'Large'   
    END) School_size,AVG(avgScore) Avg_score
FROM (
    SELECT school_name,count(*) cnt,AVG(test_score) avgScore
    FROM T
    group by school_name  
) t1
group by 
CASE WHEN cnt <100 then 'small' 
     WHEN cnt between 101 and 500 then 'Med'
     ELSE 'Large'   
END
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...