select video_id, cast( (100*wanbo+5*dianzan+3*pinglun+2*zhuanfa)*xinxiandu as signed) as hot_index from( select tv.video_id, avg(timestampdiff(second,tu.start_time,tu.end_time)>=tv.duration) as wanbo, sum(tu.if_like) as dianzan, count(tu.comment_id) as pinglun, sum(tu.if_retweet) as zhuanfa, 1/(datediff((select max(date(end_time)) from tb_user_video_log),max(end_time))+1) as xinxiandu from tb_video_info tv join tb_user_video_log tu on tv.video_id =tu.video_id where datediff((select max(date(end_time)) from tb_user_video_log),date(tv.release_time))<=29 group by tv.video_id )a order by hot_index desc limit 3
很难的题目。。
确定问题:计算每个video_id(下用id表示)下近发布一个月的几个指标。
- 完播率:完整播放的次数/播放次数,可以直接通过avg(条件)计算,不用再sum()/sum()
- 点赞数:直接用sum(if_like)
- 评论数:sum()或count()字段不会计算null值,count(comment_id)
- 转发数:直接用sum(if_retweet)
- 新鲜度:完全没理解1/(1+没有播放的天数)。。通过别人的答案明白,没有播放的天数就是:从当天(所有id下的最大日期)看这个视频(某个id)距离其最近一次播放日有几天没播放了,因此没有播放的天数=(datediff((select max(date(end_time)) from tb_user_video_log),max(end_time)),,注意这里括号很容易错
条件是:每个id发布近1个月内,因此可以表达为:某id最近一次播放时间-发布时间<=29,为什么不是等于,而是小于等于,因为有的视频可能是当前日期的5天前发布的,那某id最近一次播放时间-发布时间=5 就不满足条件,就会被剔除,但实际应该包含这个,因此取的是小于等于。
表达式:where datediff((select max(date(end_time)) from tb_user_video_log),date(tv.release_time))<=29 需要记住
where(函数(子查询)<N)是可以实现的