一. 拆解问题
完成率
完成率 rate=观看时间>=duration的观看次数/每一个video_id观看的次数
观看时间= timestampdiff(second, start_time, end_time) as time (看到解答里面有朋友直接使用end_time-start_time也可以)
观看时间>=duration的观看次数= sum(if(time>=duration),1,0)
每一个video_id的观看次数= count(video_id) group by video_id
保留三位小数 round(rate,3) as avg_comp_play_rate
Join 两张表
由于重点在于视频播放次数,info里面提供的有效信息只有duration,所以log是主表, 连接点是 video_id
二. 容易忽略的问题
筛选时间2021
按照avg_comp_play_rate从高到低排序
三. 我犯的错误
-
timestampdiff写成了timestamp
-
sum(if)的地方用的count(A>=B),count里面可以加判断语句(count(casewhen A>B then 1 else null end)
-
容易忽略的问题全忽略了。。。。
四. 代码
select
log.video_id video_id,
round(sum(if(TIMESTAMPDIFF(second,log.start_time, log.end_time ) >= info.duration,1,0))/count(log.video_id),3) avg_comp_play_rate
from
tb_user_video_log log left join tb_video_info info on log.video_id=info.video_id
where year(start_time)=2021
group by log.video_id
order by avg_comp_play_rate desc;