题解 | #近一个月发布的视频中热度最高的top3视频#
近一个月发布的视频中热度最高的top3视频
https://www.nowcoder.com/practice/0226c7b2541c41e59c3b8aec588b09ff
--热度=(a*视频完播率+b*点赞数+c*评论数+d*转发数)*新鲜度;
--新鲜度=1/(最近无播放天数+1);
--当前配置的参数a,b,c,d分别为100、5、3、2。
--最近播放日期以end_time-结束观看时间为准,假设为T,则最近一个月按[T-29, T]闭区间统计。
--结果中热度保留为整数,并按热度降序排序。
-- 需求:找出近一个月发布的视频中热度最高的top3视频
-- 分析:
①近一个月=> datediff((select max(date(end_time)) from tb_user_video_log),date(release_time))<30
②热度最高:按照hot_index倒叙排列=> order by hot_index desc
本题难度:求热度
根据题目给出的数据口径:热度=(a*视频完播率+b*点赞数+c*评论数+d*转发数)*新鲜度
视频完播率:视频完整播放/视频播放的总次数
视频完整播放=>结束播放时间-开始播放时间大于等于视频播放所需要的时间
if(timestampdiff(second,start_time,end_time)>=duration,1,0) t
视频完播率=>avg(t) y1
点赞数:视频的点赞次数=>sum(if_like) y2
评论数:视频的评价次数=>comment_sum y3
转发数:视频的转发次数=>sum(if_retweet) y4
新鲜度:新鲜度=1/(最近无播放天数+1)
最近无播放天数=>tb_user_video_log最近播放的日期 - 某个视频最近播放日期
tb_user_video_log最近播放的日期=>select max(date(end_time)) from tb_user_video_log t1
某个视频最近播放日期=>max(date(end_time)) t2
新鲜度=>1/(t1-t2+1) y5
热度=>(100*y1+5*y2+3*y3+2*y4)*y5
③top3=>limit 3
select video_id,
round((100*player+5*like_sum+3*comment_sum+2*retweet_sum)/flash) hot_index
from(
select t2.video_id,
avg(if(timestampdiff(second,start_time,end_time)>=duration,1,0)) player,
sum(if_like) like_sum,
count(comment_id) comment_sum,
sum(if_retweet) retweet_sum,
datediff((select max(date(end_time)) from tb_user_video_log),max(date(end_time))) + 1 flash,
max(date(end_time)) max_date
from tb_user_video_log t1
join tb_video_info t2
on t1.video_id=t2.video_id
where datediff((select max(date(end_time)) from tb_user_video_log),date(release_time))<30
group by t2.video_id
) t
order by hot_index desc
limit 3;
查看8道真题和解析