题解 | 统计每个班级的关键指标

统计每个班级的关键指标

https://www.nowcoder.com/practice/07beee54ac62455586016ea1b018d371

with tab as( -- 整合初级信息
select ce.student_id,cc.class_id,cc.course_id,cc.teacher_id,s.lesson_id,s.watch_minutes,s.finished_flag,s.log_ts
from course_enroll_ as ce
left join course_class_ as cc
on cc.class_id = ce.class_id
left join study_logs_ as s
on ce.student_id = s.student_id and ce.class_id = s.class_id 
where s.log_ts like '2024-08%' or s.log_ts is null
),
learn_roll_active as( -- 统计各课程的报名人数
select ce.class_id,cc.course_id,cc.teacher_id,count(distinct ce.student_id) as learners_enrolled
from course_enroll_ as ce
left join course_class_ as cc
on ce.class_id = cc.class_id
group by ce.class_id,cc.course_id,cc.teacher_id
),
senior_info as
( -- 统计出唯一键班级、课程、教室和对应的班级人数、有学习记录人数、完成过课程人数、总学习时间。
select 
t.class_id,
t.course_id,
t.teacher_id,
lra.learners_enrolled,
t.learners_active_m,
t.finishers_m,
if(t.total_minutes_m is not null , t.total_minutes_m,  0 ) as total_minutes_m
from(
select -- 统计至少学习过一次的学员、有完成记录的学员个数、总学习时间。
class_id, 
course_id,
teacher_id,
count(distinct case when log_ts is not null then student_id else null end) as learners_active_m,
count(distinct case when log_ts is not null and finished_flag =1 then student_id else null end) as finishers_m,
sum(watch_minutes) as total_minutes_m
from tab 
group by class_id,course_id,teacher_id
) as t
left join learn_roll_active as lra
on t.class_id = lra.class_id and t.course_id = lra.course_id and t.teacher_id = lra.teacher_id
)
select -- 最终产生排名并调整展示顺序
*,
rank() over(partition by course_id order by avg_minutes_per_active desc) as rank_in_course
from
(
select -- 统计完课率、人均学习时长
class_id,
course_id,
teacher_id,
learners_enrolled,
learners_active_m,
finishers_m,
if(learners_active_m = 0 ,format(0,2),round(finishers_m/learners_active_m,2)) as completion_rate,
total_minutes_m,
if(learners_active_m = 0,format(0,2),round(total_minutes_m/learners_active_m,2)) as avg_minutes_per_active
from senior_info 
) as temp
order by course_id asc,rank_in_course asc,class_id asc

全部评论

相关推荐

03-03 23:42
复旦大学 Java
_无论云泥意贯一:把复旦大学放前面,山东大学放后面,并且在两个大学后面标注985(用一些显眼的颜色标注)
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务