【SQL】 各个视频的平均完播率

【问题】

计算2021年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序。

【数据】

用户-视频互动表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-发布时间)

输出示例数据:video_id,avg_comp_play_rate

【要点】

完播率=视频完成播放的次数(end.time−start.time>=duration)视频总的播放次数完播率=\dfrac{视频完成播放的次数(end.time- start_.time>=duration)}{视频总的播放次数}完播率=视频总的播放次数视频完成播放的次数(end.timestart.time>=duration)

  • 保留三位小数 round(x,3)
  • 时间相减 timestampdiff(second,a.start_time,a.end_time)
  • 左连接 left join ,相当于将视频信息添加到互动表中,方便比较播放时长和视频时长
  • 完播率是对同一个视频拥有的多条记录进行计算,因此分组计算 group by video_id
  • 分组要对应聚合函数,可以使用sum,avg 等,实现这个计算逻辑即可
  • 降序排列 order by 列名 desc ,不加 desc 默认升序
  • 注意题目中有关时间的限定(2021年)

【解答】

select b.video_id,
       round(avg(timestampdiff(second,a.start_time,a.end_time)>=b.duration),3) as 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(a.start_time)=2021
group by b.video_id
order by avg_comp_play_rate desc

完播率的以下几种计算都是可以的,但是第一种最为简洁:

avg(timestampdiff(second,a.start_time,a.end_time)>=b.duration)
sum(timestampdiff(second,a.start_time,a.end_time)>=b.duration)/count(*)
sum(if(timestampdiff(second,a.start_time,a.end_time)>=b.duration,1,0))/count(*)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值