题解 | #近一个月发布的视频中热度最高的top3视频#

近一个月发布的视频中热度最高的top3视频

https://www.nowcoder.com/practice/0226c7b2541c41e59c3b8aec588b09ff

真的很想爆粗口,这题本身没有难度,如果你做了前面几个题那这个题更应该是行云流水。

但是!!题意太模糊了!!在限制最近一个月时间上吃了大亏,题意所谓的最近一个月发布的视频指的并不是最大发布时间减29天,而是最大end_time和发布时间的差额是29天,也就是题中说的最大end_time是当前时间。看来别人的代码才搞明白。

而且这里建议预期输出请完整的正确的答案做参考,不要随时改变!不同的错误最终显示不同的预期输出就没有参考价值了只能误导答题者。

下面是正确的代码,主要思路就三步:

第一步:T1表计算所需要的参数

第二步:限制T1表中的取值时间(最近一个月) DATEDIFF((select max(end_time) from tb_user_video_log), t2.release_time) <= 29

第三步:T2表匹配全部视频的最大播放时间,也就是当前时间

SELECT 
T1.video_id,
ROUND((100*T1.完播率+5*T1.点赞数+3*T1.评论数+2*T1.转发数)/(datediff(T2.最大视频时间,T1.单视频最近时间)+1),0) AS hot_index
FROM
    (
        -- 取出进一个月发布的视频的:点赞数,评论数,转发数,完播率,单视频最近播放时间
        select 
        t1.video_id,
        sum(t1.if_like) as 点赞数,
        count(t1.comment_id) as 评论数,
        sum(t1.if_retweet) as 转发数,
        max(date(t1.end_time)) 单视频最近时间,
        avg(if(TIMESTAMPDIFF(SECOND,t1.start_time,t1.end_time)>=t2.duration,1,0)) as 完播率
        from tb_user_video_log as t1
        left join tb_video_info as t2
        on t1.video_id = t2.video_id
        where DATEDIFF((select max(end_time) from tb_user_video_log), t2.release_time) <= 29
        group by t1.video_id
    ) T1

    left join
    (   -- 匹配全部视频的最大播放时间
        select
        video_id,
        date(end_time) as 单视频最近时间,
        max(date(end_time)) over() as 最大视频时间
        from tb_user_video_log 
    ) T2
    on T1.video_id = T2.video_id and T1.单视频最近时间= T2.单视频最近时间
ORDER BY hot_index DESC
LIMIT 3


全部评论

相关推荐

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