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;
# 这道题关键在于近一个月发布的视频,因此发布时间要进行过滤的!