题解 | #牛客直播各科目出勤率#
牛客直播各科目出勤率
https://www.nowcoder.com/practice/0cab547df4f0430b93042128f445d899
#需求:统计每个科目的出勤率 #输出:course_id、course_name、'attend_rate(%)'(出勤率) #要求:attend_rate(%)保留两位小数;course_id升序输出;出勤率=在线时长>=10min的人数/报名人数 #思路:以子查询各自查到符合要求的出勤人数和报名人数,再表链接汇总计算;要的是科目的出勤率,考虑到同一人有多次出勤的可能,要对user_id做去重 select course_id,course_name,round(tt1/tt2*100,2) 'attend_rate(%)' from( select course_id,count(distinct user_id) tt1 from attend_tb where timestampdiff(minute,in_datetime,out_datetime)>=10 group by course_id ) t1 join( select course_id,count(distinct user_id) tt2 from behavior_tb where if_sign=1 group by course_id ) t2 using(course_id) join course_tb using(course_id) order by course_id 错题集: #思路:符合要求的出勤人数单独在where里子查询;人数的出勤率需要对人数去重 select course_id,course_name, round(count(distinct user_id)/sum(if_sign)*100,2) 'attend_rate(%)' from behavior_tb join course_tb using(course_id) where user_id in( select distinct user_id from attend_tb where timestampdiff(minute,in_datetime,out_datetime)>=10 ) group by course_id,course_name order by course_id #这个方式的错误在于直接使用sum(if_sign)参与运算,而实际需要的是对科目聚合后的去重报名人数,用sum直接计算没有去重的步骤,得到的人数有差异,而且where筛选user_id得到的人数也不对;
查看3道真题和解析