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

牛客直播各科目出勤率

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

本来想着寒假一天一个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

那么这个人算不算出勤了呢?

本题并没有说明这种情况,我就当不算来处理了。

一天一个Mysql 文章被收录于专栏

学习,一天一个mysql

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务