第一步,将三个表连接,并计算得到每门课程在线时长大于10分钟的用户数

select 
t2.course_id,t2.course_name,count(distinct t3.user_id) attend
from
behavior_tb t1
join
course_tb t2
using(course_id) 
join 
attend_tb t3
using(course_id, user_id)
where timestampdiff(minute,in_datetime,out_datetime)>=10
group by t2.course_id,t2.course_name 
#t1表

第二步,根据behavior_tb计算出参与报名的人数

select 
course_id,sum(if_sign) cnt
from behavior_tb
group by course_id 
#t2表

最后将t1表和t2表依据course_id连接,并计算round(attend/cnt*100,2)即为出勤率

最终的sql如下

with t1 as(
select 
t2.course_id,t2.course_name,count(distinct t3.user_id) attend
from
behavior_tb t1
join
course_tb t2
using(course_id) 
join 
attend_tb t3
using(course_id, user_id)
where timestampdiff(minute,in_datetime,out_datetime)>=10
group by t2.course_id,t2.course_name),
t2 as(
select 
course_id,sum(if_sign) cnt
from behavior_tb
group by course_id )

select t1.course_id, t1.course_name, round(attend/cnt*100,2) attend_rate
from t1
join t2
using(course_id)
order by course_id