牛客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%的類別輸出。
結果保留兩位小數,並按播放進度倒序排序。
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