题解 | #近一个月发布的视频中热度最高的top3视频#
近一个月发布的视频中热度最高的top3视频
https://www.nowcoder.com/practice/0226c7b2541c41e59c3b8aec588b09ff
真的很想爆粗口,这题本身没有难度,如果你做了前面几个题那这个题更应该是行云流水。
但是!!题意太模糊了!!在限制最近一个月时间上吃了大亏,题意所谓的最近一个月发布的视频指的并不是最大发布时间减29天,而是最大end_time和发布时间的差额是29天,也就是题中说的最大end_time是当前时间。看来别人的代码才搞明白。
而且这里建议预期输出请完整的正确的答案做参考,不要随时改变!不同的错误最终显示不同的预期输出就没有参考价值了只能误导答题者。
下面是正确的代码,主要思路就三步:
第一步:T1表计算所需要的参数
第二步:限制T1表中的取值时间(最近一个月) DATEDIFF((select max(end_time) from tb_user_video_log), t2.release_time) <= 29
第三步:T2表匹配全部视频的最大播放时间,也就是当前时间
SELECT T1.video_id, ROUND((100*T1.完播率+5*T1.点赞数+3*T1.评论数+2*T1.转发数)/(datediff(T2.最大视频时间,T1.单视频最近时间)+1),0) AS hot_index FROM ( -- 取出进一个月发布的视频的:点赞数,评论数,转发数,完播率,单视频最近播放时间 select t1.video_id, sum(t1.if_like) as 点赞数, count(t1.comment_id) as 评论数, sum(t1.if_retweet) as 转发数, max(date(t1.end_time)) 单视频最近时间, avg(if(TIMESTAMPDIFF(SECOND,t1.start_time,t1.end_time)>=t2.duration,1,0)) as 完播率 from tb_user_video_log as t1 left join tb_video_info as t2 on t1.video_id = t2.video_id where DATEDIFF((select max(end_time) from tb_user_video_log), t2.release_time) <= 29 group by t1.video_id ) T1 left join ( -- 匹配全部视频的最大播放时间 select video_id, date(end_time) as 单视频最近时间, max(date(end_time)) over() as 最大视频时间 from tb_user_video_log ) T2 on T1.video_id = T2.video_id and T1.单视频最近时间= T2.单视频最近时间 ORDER BY hot_index DESC LIMIT 3