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

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

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

思路:

首先求每个video_id的视频完播率(完整播放次数/播放总次数), 点赞数, 评论数, 转发数,

然后筛选近一个月发布的视频。

容易理解错误的是:当天日期不一定是2021-10-03,而是所有视频播放记录中的最近一天

这里因为前面的数据需要group by,因此在group by之后如何求得当天日期是一个难点:max(date(max(end_time))) over ()

指的是 先对每个 video_id获取date(max(end_time)),之后对整个group by结果开窗求得全部date(max(end_time))的最大值 即当天日期。

select 
    video_id, 
    sum(if(timestampdiff(second,start_time,end_time)>=duration, 1, 0)) / count(start_time) complete_rate,
    sum(if_like) like_num,
    count(comment_id) comment_num,
    sum(if_retweet) retweet_num,
    1/(datediff(max(date(max(end_time))) over (), date(max(end_time))) + 1) freshness,
    max(date(max(end_time))) over () today #当天日期(每group最大日期中的最大日期)
from tb_user_video_log left join tb_video_info using(video_id)
group by video_id

解决上面内容,之后就比较容易理解了。完整代码如下:

select video_id,
    round((100*complete_rate+5*like_num+3*comment_num+2*retweet_num)*freshness, 0) hot_index
from (
    select 
        video_id, 
        sum(if(timestampdiff(second,start_time,end_time)>=duration, 1, 0)) / count(start_time) complete_rate,
        sum(if_like) like_num,
        count(comment_id) comment_num,
        sum(if_retweet) retweet_num,
        1/(datediff(max(date(max(end_time))) over (), date(max(end_time))) + 1) freshness,
        max(date(max(end_time))) over () today  #当天日期(每group最大日期中的最大日期)
    from tb_user_video_log left join tb_video_info using(video_id)
    group by video_id
) a left join tb_video_info using(video_id)
where date(release_time) between (today-interval 29 day) and today  #过滤近一个月发布的视频
order by hot_index DESC
limit 3

全部评论

相关推荐

03-18 01:22
门头沟学院 Java
肖先生~:先别说工资,现在有个工作就不错了
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务