我有一个数据集,其中包含一个我想创建其计数的任意值的枚举变量(例如,学校名称),以及一个我想包含在其中的另一个连续变量(例如,测试成绩)分析,基于任意分组。
例如
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
非常感谢您的想法!
答案 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;
我很确定任何解决方案都需要两个级别的聚合。因此,我认为这可能是最快的解决方案。