题解 | 牛客直播各科目出勤率
牛客直播各科目出勤率
https://www.nowcoder.com/practice/0cab547df4f0430b93042128f445d899
1.题目需要统计各个科目的出勤率(出勤率=出勤(在线时长10分钟及以上)人数 / 报名人数) 2.对于分子报名人数的计算,通过behavior_tb表根据if_sign是否为1来判断汇总即可 3.对于分母有效出勤人数的计算,通过attend_tb表根据时间差是否大于等于10来判断,通过timestampdiff()函数来进行计算 其实思路代码都很简单但是我翻了翻题解高赞的都是取巧做法就是简单的判断即:timestampdiff(minute,in_datetime,out_datetime) >=10 但是我认为这并不完善,题目标明了上课时间(course_datetime)那么出勤在线时长就应该在这个时间段内,xdm大学挂网课也应该有过体会,没开课前和结课后挂的时间哪个老师会认?所以我丰富了一下时间判断 即:timestampdiff(minute, case when hour(in_datetime)<19 then concat(date(in_datetime) ,' 19:00:00') else in_datetime end, case when hour(out_datetime)>21 then concat(date(out_datetime), ' 21:00:00') else out_datetime end) 这里有个小点很容易忽略就是timestampdiff这个函数参数要求的是完整的日期时间值,所以要用上concat最后代码冗杂成一坨,但是不得不说牛客有小部分的题目描述完全是诘屈聱牙 select course_id, course_name, round(100*up/dp, 2) as 'attend_rate(%)' from ( select course_name, count(user_id) as up from ( select user_id, course_name, sum(total) as cnt from ( select user_id, course_name, timestampdiff(minute, case when hour(in_datetime)<19 then concat(date(in_datetime) ,' 19:00:00') else in_datetime end, case when hour(out_datetime)>21 then concat(date(out_datetime), ' 21:00:00') else out_datetime end) as total from course_tb join attend_tb using(course_id) ) as t1 group by user_id, course_name having cnt >= 10 ) as t2 group by course_name ) as t3 join ( select course_id, course_name, sum(if_sign) as dp from behavior_tb join course_tb using(course_id) group by course_id, course_name ) as t4 using(course_name)