牛客SQL刷題第三趴——SQL大廠面試真題

01 某音短視頻

SQL156 各個視頻的平均完播率

【描述】用戶-視頻互動表tb_user_video_log。(uid-用戶ID, video_id-視頻ID, start_time-開始觀看時間, end_time-結束觀看時間, if_follow-是否關注, if_like-是否點贊, if_retweet-是否轉發, comment_id-評論ID)

短視頻信息表tb_video_info。(video_id-視頻ID, author-創作者ID, tag-類別標籤, duration-視頻時長(秒), release_time-發佈時間)

【問題】計算2021年里有播放記錄的每個視頻的完播率(結果保留三位小數),並按完播率降序排序

註:視頻完播率是指完成播放次數佔總播放次數的比例。簡單起見,結束觀看時間與開始播放時間的差>=視頻時長時,視為完成播放。
select t.video_id,
ROUND(sum(if((t.end_time-t.start_time)>=t1.duration,1,0))/count(start_time),3) as avg_comp_play_rate
from tb_user_video_log t 
left join tb_video_info t1
on t.video_id=t1.video_id
where year(t.start_time)='2021'
group by t.video_id
order by avg_comp_play_rate desc;

 解題思路:①、考察多表結合。

②、視頻完播率的計算方法。

第1步:先計算完成播放次數。sum(if((t.end_time-t.start_time)>=t1.duration,1,0

第2步:計算總播放次數。count(start_time)

第3步:保存三位小數。使用ROUND(xx,3)

③、where子條件,篩選2021年,使用year函數

④、order by排序,按照完播率降序,使用desc。

 

SQL157 平均播放進度大於60%的視頻類別

【描述】同上題

問題:計算各類視頻的平均播放進度,將進度大於60%的類別輸出。

註:播放進度=播放時長÷視頻時長*100%,當播放時長大於視頻時長時,播放進度均記為100%。

結果保留兩位小數,並按播放進度倒序排序。

select t1.tag,
concat(ROUND(avg(if(timestampdiff(second,t.start_time,t.end_time)>=t1.duration,1,
             timestampdiff(second,t.start_time,t.end_time)/t1.duration))*100,2),'%') as avg_play_progress
from tb_video_info t1
join tb_user_video_log t
on t1.video_id=t.video_id
group by t1.tag
having avg_play_progress>60
order by avg_play_progress desc;

解題思路:

1、播放進度結算

①、時間差函數,timestampdiff(unit,char(begin-end))

②、判斷,if或者用case when

③、結果保留兩位小數,使用round(xx,2)

④、使用concat拼接數值和「%」

2、多表的內連接。

3、進度大於60%的類別輸出,因為這個數值是聚合函數,需要使用having函數

4、並按播放進度倒序排序。使用order by desc