【SQL 01 计算播放视频的平均完播率】

题目描述

用户-视频互动表tb_user_video_log:
iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id
110120012021-10-01 10:00:002021-10-01 10:00:30011NULL
210220012021-10-01 10:00:002021-10-01 10:00:24011NULL
310220012021-10-01 11:00:002021-10-01 11:00:340001732526
410320022021-09-01 10:00:002021-9-01 10:00:42001NULL
510120022021-10-01 11:00:002021-10-01 10:00:30110NULL
  • uid:用户ID
  • video_id:视频ID
  • start_time:开始观看时间
  • end_time:结束观看时间
  • if_follow:是否关注
  • if_like:是否点赞
  • if_retweet:是否转发
  • comment_id:评论ID
短视频信息表tb_video_info:
idvideo_idauthortagdurationrelease_time
12001901影视302021-01-01 07:00:00
22002901美食602021-01-01 07:00:00
32003902旅游902021-01-01 07:00:00
  • video_id:视频ID
  • author:创作者ID
  • tag:类别标签
  • duration:视频时长(秒)
  • release_time:发布时间
问题:计算2021年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序

注:视频完播率是指完成播放次数占总播放次数的比例。简单起见,结束观看时间与开始播放时间的差>=视频时长时,视为完成播放。

最终输出样式:
video_idavg_comp_play_rate
20010.667
20020.718

解题思路

1.取数范围:
  • 年份 = 2001
  • 有播放记录的每个视频
2.取数字段:
  • video_id (有播放记录的视频号)
  • avg_comp_play_rate(完播率)
3.解题关键是拆解完播率的计算:

视频完播率 = 视频完播总次数

SQL字段1:
SELECT a.video_id ,
       round(sum(if(end_time - start_time >= duration, 1, 0))/count(start_time ),3) as avg_comp_play_rate
FROM tb_user_video_log AS tuvl
#左连接的目的是确保:统计有播放记录的视频号
LEFT JOIN tb_video_info AS tvi
on tuvl.video_id = tvi.video_id
# 限制统计范围:年份 = 2021
WHERE year(start_time) = 2021
# 按视频号(video_id)分类汇总统计 
GROUP BY a.video_id
# 根据完播率降序排列
ORDER BY avg_comp_play_rate DESC;
SQL字段2:
SELECT a.video_id ,
       round(sum(IF(TIMESTAMPDIFF(SECOND, start_time, end_time)>=duration, 1, 0),3) as avg_comp_play_rate
FROM tb_user_video_log AS tuvl
#左连接的目的是确保:统计有播放记录的视频号
LEFT JOIN tb_video_info AS tvi
on tuvl.video_id = tvi.video_id
# 限制统计范围:年份 = 2021
WHERE year(start_time) = 2021
# 按视频号(video_id)分类汇总统计 
GROUP BY a.video_id
# 根据完播率降序排列
ORDER BY avg_comp_play_rate DESC;

Knowleage Point 知识点

TIMESTAMPDIFF

根据单位返回时间差,对于传入的begin和end不需要相同的数据结构,可以存在一个为Date一个DateTime

语法:
  • TIMESTAMPDIFF(unit,begin,end)
Unit
  • MICROSECOND 毫秒
  • SECOND 秒
  • MINUTE 分钟
  • HOUR 小时
  • DAY 天
  • WEEK 星期
  • MONTH 月
  • QUARTER 季度
  • YEAR 年
TIMESTAMPDIFF函数容易疏忽的地方
select timestampdiff(day,"2012-08-22 15:15:16","2012-08-23 15:15:16");

1

select timestampdiff(day,"2012-08-22 15:15:15","2012-08-23 15:15:16");

1

select timestampdiff(day,"2012-08-22 15:15:17","2012-08-23 15:15:16");

0

天数的时间差是以246060(86400)为依据的。 假如相差间隔小于86400秒,则为0,如果等于86400秒或大于86400秒且小于86400*2秒,则为1。

如果单位为分钟,那么计算间隔分钟是以60秒为依据的。 假如相差间隔小于60秒,则为0,如果等于60秒或大于60秒且小于60*2秒,则为1。

select timestampdiff(minute,"2012-08-22 15:15:16","2012-08-22 15:16:15");

0

select timestampdiff(minute,"2012-08-22 15:15:16","2012-08-22 15:16:16");

1

select timestampdiff(minute,"2012-08-22 15:15:16","2012-08-22 15:16:56");

1

select timestampdiff(minute,"2012-08-22 15:15","2012-08-22 15:16");

1

Reference

戴杭林的博客园
牛客网练习
https://blog.csdn.net/zm2714/article/details/7896381

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Eason DayDayUp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值