题解 | #近一个月发布的视频中热度最高的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;
还没写完,外面再套一层筛选条件就行。

全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务