题解 | #各用户等级的不同得分表现占比#

各用户等级的不同得分表现占比

https://www.nowcoder.com/practice/ebff819fd38c46db8a42dfe43ca7b33a

# 先找到有记录的,新增一个得分等级字段
# 再按用户等级和得分等级分组,统计占比

# 暴力法,考虑所有等级情况,分别计数
WITH temp_0 AS(
SELECT uid, exam_id, score, level, 
	# 使用case when语句为不同区间赋值
    CASE WHEN score >= 90 THEN '优'
        WHEN score < 90 AND score >= 75 THEN '良'
        WHEN score < 75 AND score >= 60 THEN '中'
        ELSE '差' END score_grade,
	# 计算每个等级的用户们的得分等级为优次数
    SUM(IF(score >= 90, 1, 0)) OVER(PARTITION BY level) a_1,
	# # 计算每个等级的用户们的得分等级为良的次数
    SUM(IF(score < 90 AND score >= 75, 1, 0)) OVER(PARTITION BY level) a_2,
    SUM(IF(score < 75 AND score >= 60, 1, 0)) OVER(PARTITION BY level) a_3,
    SUM(IF(score < 60, 1, 0)) OVER(PARTITION BY level) a_4,
	# 计算每个等级用户们的作答次数
    COUNT(score) OVER(PARTITION BY level) all_t # 每个用户的答题次数
FROM user_info
RIGHT JOIN exam_record USING(uid)
# 排除无分数的作答
WHERE score IS NOT NULL
)

# 因为没有分组,所以要对所有记录去重
SELECT DISTINCT *
FROM (
SELECT level, score_grade, 
	# 将占比视作计算字段,考虑不同情况
    CASE WHEN score_grade = '优' THEN ROUND(a_1 / all_t, 3)
        WHEN score_grade = '良' THEN ROUND(a_2 / all_t, 3)
        WHEN score_grade = '中' THEN ROUND(a_3 / all_t, 3)
        ELSE ROUND(a_4 / all_t, 3) END ratio
FROM temp_0
) a
ORDER BY level DESC, ratio DESC

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务