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)
- 最后拼接表格进行计算