本来想着寒假一天一个sql和算法题,结果中间突发事故导致半个月没有写题,哎想想就难受。
通过代码
1.1SELECT t1.course_id, course_name, round(attend * 100 / sign,2) 'attend_rate(%)' from course_tb t1 join(select sum(if_sign) sign, course_id FROM behavior_tb group BY course_id)t2 ON t1.course_id = t2.course_id join(select course_id, COUNT(DISTINCT user_id,course_id) attend FROM(SELECT user_id, course_id, TIMESTAMPDIFF(minute,in_datetime,out_datetime) differ FROM attend_tb having differ >= 10)t GROUP BY course_id)t3 on t2.course_id = t3.course_id order by t1.course_id
思路
统计每个科目的出勤率(attend_rate(%),结果保留两位小数),出勤率=出勤(在线时长10分钟及以上)人数 / 报名人数,输出结果按course_id升序排序,
题目要求很清晰,我们要算出来出勤人数以及报名人数
1.出勤人数
1.1在线时间 >=10min
SELECT
user_id,
course_id,
TIMESTAMPDIFF(minute,in_datetime,out_datetime) differ
FROM
attend_tb
having
differ >= 10
用timestampdiff计算时间差并以minute为单位
用having查找出来时间大于10
1.2去重并统计人数
select
course_id,
COUNT(DISTINCT user_id,course_id) attend
FROM(1.1.代码)t
GROUP BY
course_id
当同一个人在同一个课程里待了多次我们按一次计算,所以需要count(distinct)
2.报名人数
select
sum(if_sign) sign,
course_id
FROM
behavior_tb
group BY
course_id
3.总结
将1 2 表以及课程信息表,三表连接就能找出答案,问题:
如果一个人在一个视频呆了5分钟,然后出去1min,又回来待5min
那么这个人算不算出勤了呢?
本题并没有说明这种情况,我就当不算来处理了。