此题共包含两张表:
表1:用户-视频互动表tb_user_video_log
表2:短视频信息表tb_video_info
要解决的问题:
计算2021年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序
解题思路:
-
2021年有播放记录的视频,where条件语句
-
每个视频的完播率(满足条件的视频个数/全部视频个数),需要将表1和表2关联,关联条件为video_id
a. 判断是否满足条件,TIMESTAMPDIFF(second,start_time,end_time) >= duration
b. 满足条件的视频个数,sum(if(a, 1, 0))
c. 全部视频个数,只要播放过就算,count(start_time)
-
将数据按video_id分组
-
按完播率排序
易混易错:
- sum VS count
-
sum是对符合条件的记录的数值列求和
-
count是行数汇总,count(列名)不包含null值的行数,而count(*)包含所有行
-
因此如果在与if条件搭配使用时,一般会选择sum
- timestamp VS timestampdiff
-
TIMESTAMPDIFF是用来获取两个时间间隔的函数,语法为timestampdiff(interval,datetime_expr1,datetime_expr2) interval可以是时、分、秒、月、日、年、星期等等
-
timestamp是日期型数据,通常用来插入或更新记录
select a.video_id,
ROUND(sum(if (TIMESTAMPDIFF(second,start_time,end_time) >= duration, 1, 0)) / count(start_time), 3) avg_comp_play_rate
from tb_user_video_log a
left join tb_video_info b
on a.video_id = b.video_id
where year(start_time) = 2021
GROUP BY a.video_id
order by avg_comp_play_rate desc