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 牛客直播各科目平均观看时长
- 第一次是这么写的,结果发现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
- 正确答案如下所示:
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 牛客直播各科目出勤率
- 注意: a表和b表连接了两个,user_id,course_id,且因为b表包含a表,所以要用right join。不加right的话,b表中的一部分内容会缺失,答案中的SQL的出勤率输出是错的。
- 倒数第三行是 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 牛客直播各科目同时在线人数
-
本题类似于SQL163 每篇文章同一时刻最大在看人数,计算的方法是一样的
-
第一步,取用户进入直播间,并赋值uv为1;取用户离开直播间,并赋值uv为-1;
-
第二步,由于窗口函数中的排序具有累加的效果,所以可以使用窗口函数计算直播间的瞬时用户数;
-
第三步,取各个科目直播间的瞬时最大值,并按照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