select  e.course_id, course_name,round(sum(if_attend) * 100 / sum(if_sign), 2) 'attend_rate(%)'

from(
    select user_id, course_id, if_sign from behavior_tb
) e

left join(
    select a.user_id, a.course_id, if (max(timestampdiff(minute, in_datetime, out_datetime)) > 10, 1, 0) 'if_attend'
    from attend_tb a
    group by a.user_id, a.course_id 
) d

on e.user_id = d.user_id and e.course_id = d.course_id
join course_tb c on e.course_id = c.course_id
group by e.course_id, c.course_name

order by e.course_id asc ;


  • 记录每个用户对每个课程是否出勤,其实这里不应该使用某一段是否大于10分钟,从例子中可以看到,用户可能离开几分钟,所以逻辑上应该使用sum更为合理
select a.user_id, a.course_id, if (max(timestampdiff(minute, in_datetime, out_datetime)) > 10, 1, 0) 'if_attend'
    from attend_tb a
    group by a.user_id, a.course_id 
  • 可以behavior_tb表获取每个课程注册的人数,总的出勤率 = sum(if_attend) * 100 / sum(if_sign)
  • 最后拼接表格进行计算