题解 | #近一个月发布的视频中热度最高的top3视频#
近一个月发布的视频中热度最高的top3视频
https://www.nowcoder.com/practice/0226c7b2541c41e59c3b8aec588b09ff
这道题计算新鲜度不能用TIMESTAMPDIFF(DAY)来直接计算两日期天数差距
第一列是用的TIMESTAMPDIFF,他会把时分秒计算进去,不满足24小时不为一天,所以第一列第二排为零。
而计算新鲜度要用DATEDIFF,不带时分秒计算,正确结果就是第二列。把这个问题解决了就简单了,直接一排代码带走。
其他需要注意的就是COUNT(*)不指定字段会计算NULL值,COUNT(指定字段)不会计算NULL值。
SELECT video_id , ROUND((100 * SUM(CASE WHEN TIMESTAMPDIFF(SECOND,start_time,end_time) < duration THEN 0 ELSE 1 END) / COUNT(*) + 5 * SUM(if_like) + 3 * COUNT(comment_id) + 2 * SUM(if_retweet)) / (DATEDIFF((SELECT MAX(DATE(end_time)) FROM tb_user_video_log),MAX(DATE(end_time))) + 1)) AS hot_index FROM tb_user_video_log JOIN tb_video_info USING (video_id) WHERE DATEDIFF((SELECT MAX(end_time) FROM tb_user_video_log),release_time) <= 29 GROUP BY video_id ORDER BY hot_index DESC LIMIT 3;
觉得这个不好看的话可以使用 下面这个
SELECT video_id , SUM(CASE WHEN TIMESTAMPDIFF(SECOND,start_time,end_time) < duration THEN 0 ELSE 1 END) / COUNT(*) AS "完播率" , SUM(if_like) AS "点赞数" , COUNT(comment_id) AS "评论数" , SUM(if_retweet) AS "转发数" , DATEDIFF((SELECT MAX(DATE(end_time)) FROM tb_user_video_log),MAX(DATE(end_time))) AS "新鲜度" FROM tb_user_video_log JOIN tb_video_info USING (video_id) WHERE DATEDIFF((SELECT MAX(end_time) FROM tb_user_video_log),release_time) <= 29 GROUP BY tb_user_video_log.video_id;还没写完,外面再套一层筛选条件就行。