题解 | #牛客直播各科目出勤率#

牛客直播各科目出勤率

https://www.nowcoder.com/practice/0cab547df4f0430b93042128f445d899

with cte1 as (
select 
	course_id
	,course_name 
	,substring_index(course_datetime,'-',3) as start_datetime
	,concat_ws(' ',substring_index(course_datetime,' ',1),substring_index(course_datetime,'-',-1)) as end_datetime
from course_tb
)
,
cte2 as (
select 
t1.user_id ,t1.course_id ,t3.course_name
,if(sum(TIMESTAMPDIFF(minute,in_datetime,out_datetime)) >= 10,1,0) time_
from attend_tb t1
left join behavior_tb t2
on t1.course_id = t2.course_id 
and t1.user_id = t2.user_id
LEFT JOIN cte1 t3 ON t1.course_id = t3.course_id
where if_sign = 1 and  TIMESTAMPDIFF(minute,in_datetime,out_datetime) > 0
and out_datetime >= start_datetime
and in_datetime <= end_datetime
group by t1.user_id ,t1.course_id ,t3.course_name
)
,
cte3 as (
select 
t1.course_id  ,
t3.course_name,
count(distinct t1.user_id) cn_sign
from  behavior_tb t1
left join attend_tb t2
on t1.course_id = t2.course_id 
and t1.user_id = t2.user_id
LEFT JOIN cte1 t3 ON t1.course_id = t3.course_id
where if_sign = 1
group by t1.course_id 
,t3.course_name
)
,
cte4 as(
select course_id,course_name,count(course_id) cn_up
from cte2
where time_ = 1
group by course_id,course_name
)
select
t1.course_id,t1.course_name,round(cn_up/cn_sign*100,2)
from cte4 as t1
left join cte3 as t2
on t1.course_id = t2.course_id
order by t1.course_id
;

这题有几点需要考虑的:1、报名的用户可能都没有参加上课,那么主表应该是报名表,2、一个用户可能会多次登录上课,并且有可能会出现多段少于十分钟的学习,那么要考虑将这些时间累加,最后判断累计时间是否超过10分钟,3、对于单用户单课程的多次观看或者单用户的多次报名,记得要去重。

全部评论

相关推荐

脑袋锈住了:你这算啥,哥们中科院中强所硕士,本科211,叫我去干分拣,时薪20
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务