牛客SQL 大厂面试真题 牛客直播课分析 5套代码及解析

6.牛客直播课分析(在线教育行业)

SQL185 牛客直播转换率

select course_id,
course_name,
round(sum(if_sign)/sum(if_vw)*100,2) as sign_rate
from course_tb
join behavior_tb using(course_id)
group by course_id,course_name
order by course_id

SQL186 牛客直播开始时各直播间在线人数

select course_id,
course_name,
count(distinct user_id) as online_num
from course_tb
join attend_tb using(course_id)
where time(in_datetime)<='19:00:00'
    and time(out_datetime)>='19:00:00'
group by course_id,course_name
order by course_id

SQL187 牛客直播各科目平均观看时长

  1. 第一次是这么写的,结果发现SQL课程的时间偏小。仔细读题,才发现,这个观看时长定义为离开直播间的时间与进入直播间的时间之差,单位是分钟。我把他定义的时间不超过课程的总时间,是我想多了。。。
select course_name,
round(avg(
    if(timestampdiff(second,in_datetime,out_datetime)/60>120
    ,120,
    timestampdiff(second,in_datetime,out_datetime)/60)
    ),2) as avg_Len
from course_tb
join attend_tb using(course_id)
group by course_name
order by avg_Len desc
  1. 正确答案如下所示:
select course_name,
round(avg(timestampdiff(second,in_datetime,out_datetime)/60),2) as avg_Len
from course_tb
join attend_tb using(course_id)
group by course_name
order by avg_Len desc

SQL188 牛客直播各科目出勤率

  1. 注意: a表和b表连接了两个,user_id,course_id,且因为b表包含a表,所以要用right join。不加right的话,b表中的一部分内容会缺失,答案中的SQL的出勤率输出是错的。
  2. 倒数第三行是 b.course_id=c.course_id ,而不是a.course_id=c.course_id。如果连接了a表而不是b表,那么就会出现类似于提示1中出现的情况,输出的结果是以a表为基准的,b表中有一部分内容会缺失,答案中的SQL的出勤率也会是错的。
select 
c.course_id,
course_name,
round(
count(distinct if(timestampdiff(second,in_datetime,out_datetime)>=600,a.user_id,null))*100
/count(distinct if(if_sign=1,b.user_id,null))
,2) as attend_rate
from attend_tb as a
right join behavior_tb as b on a.user_id=b.user_id and a.course_id=b.course_id
join course_tb as c on b.course_id=c.course_id
group by c.course_id,course_name
order by c.course_id

SQL189 牛客直播各科目同时在线人数

  1. 本题类似于SQL163 每篇文章同一时刻最大在看人数,计算的方法是一样的

  2. 第一步,取用户进入直播间,并赋值uv为1;取用户离开直播间,并赋值uv为-1;
    共有24条记录

  3. 第二步,由于窗口函数中的排序具有累加的效果,所以可以使用窗口函数计算直播间的瞬时用户数;
    在这里插入图片描述

  4. 第三步,取各个科目直播间的瞬时最大值,并按照course_id排序。
    在这里插入图片描述

select 
course_id,
course_name,
max(uv_cnt) as max_num
from (
    select
    course_id,
    course_name,
    sum(uv)over(partition by course_id order by dt,uv desc) uv_cnt
    from (
        select 
        course_id,
        user_id,
        in_datetime as dt,
        1 as uv 
        from attend_tb
        union all
		select 
        course_id,
        user_id,
        out_datetime as dt,
        -1 as uv 
        from attend_tb
        ) as a
    join course_tb using(course_id)
    ) as b
group by course_id,course_name
order by course_id

猜你喜欢

转载自blog.csdn.net/qq118640594X/article/details/127378315