# SELECT
#   video_id,
#   ROUND((100 * finished_rate 
#    + 5 * like_cnt 
#    + 3 * comment_count 
#    + 2 * retweet_cnt) / (unfinished_day_cnt + 1)) hot_index
# FROM (
#   SELECT
#     i.video_id,
#     SUM(TIMESTAMPDIFF(second, start_time, end_time) >= duration) / COUNT(*) finished_rate,
#     SUM(if_like = 1) like_cnt,
#     SUM(IF(comment_id IS NOT NULL, 1, 0)) comment_count,
#     SUM(if_retweet = 1) retweet_cnt,
#     DATEDIFF(DATE((SELECT MAX(end_time) FROM tb_user_video_log)), MAX(DATE(end_time))) unfinished_day_cnt
#   FROM tb_video_info i
#   JOIN tb_user_video_log USING(video_id)
#   WHERE DATEDIFF(DATE((SELECT MAX(end_time) FROM tb_user_video_log)), DATE(release_time)) <= 29 
#   GROUP BY 1
# ) t
# ORDER BY 2 DESC LIMIT 3


# 计算视频完播率,点赞数,评论数,转发数 以及新鲜度
WITH temp AS (
    SELECT
    i.video_id,
    # 计算完播率
    sum(TIMESTAMPDIFF(second,start_time,end_time)>=duration)/count(*) finished_rate,
    # 点赞率
    sum(if_like=1) like_cnt,
    # 评论数
    count(comment_id) comment_count,
    # 转发数
    sum(if_retweet =1 ) retweet_cnt,
    # 计算最近播放时间
    DATEDIFF(DATE((SELECT MAX(end_time) FROM tb_user_video_log)),MAX(DATE(end_time))) unfinished_day_cnt
    FROM tb_video_info i
    JOIN tb_user_video_log USING(video_id)
    WHERE DATEDIFF(DATE((SELECT MAX(end_time) FROM tb_user_video_log)),DATE(release_time)) <= 29
    GROUP BY 1
)
SELECT video_id,
    round(
    (100 * finished_rate
    + 5 * like_cnt
    + 3 * comment_count
    + 2 * retweet_cnt) / (unfinished_day_cnt+1)) hot_index
FROM  temp
ORDER BY hot_index DESC LIMIT 3

大佬的思维能力就是强!

注意事项:

主要是时间的问题,因为要算的是近一个月内发布的视频的热度情况,所以在计算相差时间时一定要减的是发布时间;

二是在计算少于30天的情况时,先从查询中找到最大的那个为当前时间,然后再计算该视频与当前时间的差值。