with sign_table as( select course_id,course_name,sum(if_sign) as sign_num from behavior_tb left join course_tb using(course_id) group by course_id,course_name ) select course_id,course_name, round(100 * count(course_id) / sign_num ,2) as attend_rate from ( select course_id,user_id,sum(watch_time) as sum_watch_time from ( select course_id,user_id, timestampdiff(MINUTE,in_datetime,out_datetime) as watch_time from attend_tb order by course_id,user_id ) t1 group by course_id,user_id having sum_watch_time >= 10 ) t2 left join sign_table using(course_id) group by course_id,course_name order by course_id
建立一个临时表查询报名人数
再计算记录中每次的观看时间,按课程和用户分组后累加,选取出观看分数大于等于10的数据
再嵌套查询,计算每个课程中大于10分钟的观众个数,再连接报名表,计算出勤率