【腾讯】统计班级月度学习指标及课程内排名
JOIN 连接聚合函数窗口函数CASE WHEN日期函数用户行为分析面试真题
题目描述
来源:腾讯 SQL 面试真题
某在线教育平台需要按月评估各班级的活跃学习与完课情况,用于课后督学与教师考核。请基于班级信息、课程报名和学习日志三张表,统计 2024 年 8 月每个班级的关键指标及其在同课程内的排名。
数据表
course_class_ 班级信息表
| 字段 | 类型 | 说明 |
|---|---|---|
| class_id | INT | 班级编号,主键 |
| course_id | INT | 课程编号 |
| teacher_id | INT | 教师编号 |
| start_date | DATE | 开班日期 |
| end_date | DATE | 结课日期,可为 NULL,表示在读 |
course_enroll_ 报名记录表
| 字段 | 类型 | 说明 |
|---|---|---|
| student_id | INT | 学员编号 |
| class_id | INT | 班级编号 |
| enroll_date | DATE | 报名日期 |
同一学生可以报名多个班级,同一班级内同一学生只出现一次。
study_logs_ 学习日志表
| 字段 | 类型 | 说明 |
|---|---|---|
| student_id | INT | 学员编号 |
| class_id | INT | 班级编号 |
| lesson_id | INT | 课节编号 |
| watch_minutes | INT | 学习分钟数,非负 |
| finished_flag | TINYINT(1) | 是否完成该课节,1 表示完成 |
| log_ts | DATETIME | 学习日志时间 |
题目要求
以 2024-08-01 至 2024-08-31 为统计窗口,每个班级输出一行:
class_id、course_id、teacher_id。learners_enrolled:班级报名人数。learners_active_m:当月有学习日志的去重学员数。finishers_m:当月至少完成过一个课节的去重学员数。completion_rate:finishers_m / learners_active_m,活跃人数为 0 时记为 0,四舍五入保留 2 位小数。total_minutes_m:当月总学习分钟数。avg_minutes_per_active:total_minutes_m / learners_active_m,活跃人数为 0 时记为 0,四舍五入保留 2 位小数。rank_in_course:在相同 course_id 内按 avg_minutes_per_active 降序使用RANK()排名。
结果按 course_id、rank_in_course、class_id 升序排列。要求使用全部三张表,并使用分组聚合、条件去重、日期过滤、窗口函数和空值处理。
数据样例
| class_idPKINT | course_idINT | teacher_idINT | start_dateDATE | end_dateDATE |
|---|---|---|---|---|
| 101 | 10 | 1001 | 2024-07-01 | NULL |
| 102 | 10 | 1002 | 2024-07-15 | NULL |
| 103 | 10 | 1003 | 2024-08-01 | NULL |
| 201 | 20 | 2001 | 2024-06-01 | 2024-09-30 |
| 202 | 20 | 2002 | 2024-07-01 | NULL |
| 203 | 20 | 2003 | 2024-08-10 | NULL |
输入数据显示 6 / 6 行
SQL 编辑器正在保存草稿...
Ctrl + Enter 运行
正在加载 SQL 编辑器...
运行你的 SQL 查询后,结果将显示在这里