题解 | #近一个月发布的视频中热度最高的top3视频#
近一个月发布的视频中热度最高的top3视频
http://www.nowcoder.com/practice/0226c7b2541c41e59c3b8aec588b09ff
通过代码
DATE_SUBselect video_id,
round((100 * avg_rate + 5 * likes + 3 * comments + 2 * retweets) * (1 / (end_time + 1)), 0) hot_index
from (SELECT u.video_id video_id,
(sum(if((TIMESTAMPDIFF(SECOND, start_time, end_time) >= duration), 1, 0)) / COUNT(*)) avg_rate,
sum(if_like) likes,
count(comment_id) comments,
sum(if_retweet) retweets,
timestampdiff(day, date(max(end_time)), (select date(max(end_time)) from tb_user_video_log)) end_time
FROM tb_user_video_log u
JOIN
tb_video_info i
ON
u.video_id = i.video_id
WHERE date(release_time) between
DATE_SUB((select max(end_time) from tb_user_video_log), INTERVAL 30 day)
and (select max(end_time) from tb_user_video_log)
GROUP BY u.video_id
) t
order by hot_index desc
limit 3
思路
先上题目要求
找出近一个月发布的视频中热度最高的top3视频。
注:
热度=(a视频完播率+b点赞数+c评论数+d转发数)新鲜度;
新鲜度=1/(最近无播放天数+1);
当前配置的参数a,b,c,d分别为100、5、3、2。
最近播放日期以end_time-结束观看时间为准,假设为T,则最近一个月按[T-29, T]闭区间统计。
结果中热度保留为整数,并按热度降序排序。
首先是视频完播率,这个我们之前做过就是这一类的第一题,这里就不重复了,
然后点赞数、转发数都很简单
问题是评论数:这里给出的数据是comment_id ,后来想想发现完全没问题:一条记录是一次播放,所以最多一个评论,没毛病。
然后是新鲜度:1/整个表最后一个播放时间,距离该视频最后一次播放时间天数+1
但是这里有问题,而且以前我也遇到过这个问题,连续两次作答试卷的最大时间窗
就是timestampdiff或者出题人的锅!
最近30天,我用的函数DATE_SUB
DATE_SUB() 函数从日期减去指定的时间间隔。
语法
DATE_SUB(date,INTERVAL expr type)
date 参数是合法的日期表达式。expr 参数是希望添加的时间间隔。
一天一个Mysql 文章被收录于专栏
学习,一天一个mysql