WITH t1 AS ( SELECT DATE(MAX(end_time)) AS max_date, DATE_ADD(DATE(MAX(end_time)), INTERVAL -29 DAY) AS min_date FROM tb_user_video_log ), t2 AS ( SELECT tu.video_id, tu.start_time, tu.end_time, tu.if_like, tu.comment_id, tu.if_retweet, if(TIMESTAMPDIFF(SECOND, start_time, end_time) / tv.duration >= 1, 1, 0 ) AS ratio, max_date FROM tb_user_video_log tu JOIN t1 LEFT JOIN tb_video_info tv ON tu.video_id = tv.video_id WHERE DATE(end_time) BETWEEN min_date AND max_date AND DATE (release_time) BETWEEN min_date AND max_date ), t3 AS ( SELECT video_id, SUM(ratio) / count(video_id) AS wanbo_ratio, SUM(if_like) AS sum_like, SUM(IF(comment_id IS NULL,0,1)) AS sum_comment, SUM(if_retweet) AS sum_retweet, TIMESTAMPDIFF (DAY ,MAX(DATE (end_time)), MAX(max_date)) no_wanbo FROM t2 GROUP BY video_id ), t4 AS ( SELECT video_id, 100 * wanbo_ratio + 5 * sum_like + 3 * sum_comment + 2 * sum_retweet AS hot_left, 1 / (no_wanbo + 1) AS hot_right FROM t3 ) SELECT t4.video_id, ROUND(hot_left * hot_right,0) AS hot_index FROM t4 LEFT JOIN tb_video_info tv ON tv.video_id = t4.video_id ORDER BY hot_index DESC LIMIT 3; # 这道题关键在于近一个月发布的视频,因此发布时间要进行过滤的!