基于另一个变量(SQL)的频率分组的变量平均值

时间:2018-09-19 23:14:51

标签: mysql sql

我有一个数据集,其中包含一个我想创建其计数的任意值的枚举变量(例如,学校名称),以及一个我想包含在其中的另一个连续变量(例如,测试成绩)分析,基于任意分组。

例如

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等)。

理想结果如下:

School_size  Avg_score
Small         87
Med           89
Large         88

非常感谢您的想法!

3 个答案:

答案 0 :(得分:2)

您可以尝试在子查询中按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

答案 1 :(得分:2)

您可以这样做

 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

答案 2 :(得分:1)

您可以使用两个聚合级别来执行此操作。如果我理解正确:

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;

我很确定任何解决方案都需要两个级别的聚合。因此,我认为这可能是最快的解决方案。