题解 | #各个视频的平均完播率#

各个视频的平均完播率

http://www.nowcoder.com/practice/96263162f69a48df9d84a93c71045753

  1. 先理解题目意思:有播放记录的视频的id号和其完播率。条件是:2021年和根据其完播率降序排序。
  2. 拆解复杂指标:这里需要拆解的是完播率这个指标 alt

注意:记得加上题目的限制条件

答案如下:

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 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;
全部评论
为什么会有大于这种情况呢,开始时间又不能是负数
1
送花
回复 分享
发布于 2022-03-21 14:10
if判断可以省略,直接sum((end_time - start_time) >= duration)
8
送花
回复 分享
发布于 2022-02-08 15:53
秋招专场
校招火热招聘中
官网直投
实mysql的时间相减是做了一个隐式转换操作,将时间转换为整数,但并不是用unix_timestamp转换,而是直接把年月日时分秒拼起来,如2013-04-21 16:59:33 直接转换为20130421165933,由于时间不是十进制,所以最后得到的结果没有意义
8
送花
回复 分享
发布于 2022-08-18 17:24 北京
時間不能直接相減 會出問題
6
送花
回复 分享
发布于 2022-04-22 10:48
查了一下,时间格式不能单纯的直接相减,得看是date格式还是time格式
5
送花
回复 分享
发布于 2022-05-19 15:18
if(end_time - start_time >= duration, 1, 0) 类似三元运算符 if(false,1,3) 假取后者3,if(true,1,3);假取前者1
3
送花
回复 分享
发布于 2022-09-12 17:43 上海
为什么我自己写一样的代码通不过???
3
送花
回复 分享
发布于 2022-10-13 14:14 日本
很简洁的方法,没用到subquery,赞
1
送花
回复 分享
发布于 2022-05-25 15:59
我自己改了好久都不对,复制了这段代码提交和我自己写的代码提交的结果都是一样的,都是没有通过
1
送花
回复 分享
发布于 2022-12-06 14:00 江苏
为啥我写这个实例不能通过呢?请大佬帮忙看看:select distinct b.video_id, round(sum(if(b.end_time - b.start_time >= a.duration, 1, 0)) / count(b.start_time),3) as avg_comp_play_rate from tb_user_video_log b left join ( select video_id, duration from tb_video_info where video_id in ( select distinct video_id from tb_user_video_log where year(start_time) = 2021 ) )a on a.video_id = b.video_id group by b.video_id order by avg_comp_play_rate desc;
1
送花
回复 分享
发布于 2023-10-01 21:47 河南
应该是视频信息表做左表吧?有些视频发了没人看,也要统计完播率。默认有观看记录的在视频信息表都会有记录吧
1
送花
回复 分享
发布于 04-12 17:02 上海
省略可以求和吗
点赞
送花
回复 分享
发布于 2022-03-15 17:22
问一下大家为什么这里用count就不行呢,测试用例总是不对
点赞
送花
回复 分享
发布于 2022-07-02 12:02
这两个表相连,为什么是用left join,而不是用right join 呢?
点赞
送花
回复 分享
发布于 2022-08-05 13:57
可以直接用avg,不用麻烦用sum / count了
点赞
送花
回复 分享
发布于 2022-10-16 06:28 美国
SELECT a.video_id , round(sum(if(timestampdiff(minute,a.start_time,a.end_time)>= b.duration, 1, 0))/count(start_time ),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 GROUP BY a.video_id having year(a.start_time)=2021 ORDER BY avg_comp_play_rate DESC; 能帮我分析一下哪里有问题吗
点赞
送花
回复 分享
发布于 2023-07-19 08:51 北京
这句round(sum(if(end_time - start_time >= duration, 1, 0))/count(start_time ),3) as avg_comp_play_rate里面, “duration”不用指定在哪个表吗
点赞
送花
回复 分享
发布于 2023-09-06 17:51 浙江
group by了不是用having吗,为什么用where呢?
点赞
送花
回复 分享
发布于 2023-09-13 16:20 湖北
select video_id AS avg_comp_play_rate, round(avg((end_time - start_time) >= (select vi.duration from tb_video_info vi where vi.video_id = tb_user_video_log.video_id)), 3) AS avg_comp_play_rate from tb_user_video_log where year(start_time) = 2021 group by video_id order by avg_comp_play_rate descselect video_id AS avg_comp_play_rate, round(avg((end_time - start_time) >= (select vi.duration from tb_video_info vi where vi.video_id = tb_user_video_log.video_id)), 3) AS avg_comp_play_rate from tb_user_video_log where year(start_time) = 2021 group by video_id order by avg_comp_play_rate desc
点赞
送花
回复 分享
发布于 2023-09-27 13:07 广东
这里直接count(start_time)不会把空值也计算进去吗
点赞
送花
回复 分享
发布于 02-20 15:51 广东

相关推荐

245 27 评论
分享
牛客网
牛客企业服务