思路:反向推导, 正向执行

反向推导

  1. 要获得近一个月发布的视频中热度最高的top3视频, 需要先计算近一个月发布的每一个视频的热度值
  2. 计算视频热度,根据热度的计算公式分解出完播率、点赞数、评论数、转发数和最近无播放天数, 以视频为单位进行统计

正向执行

  1. 盘点近一个月发布的视频,并计算每个视频的完播率(完播数/播放数)、点赞数、评论数、转发数和最近无播放天数
  2. 根据热度计算公式带入分解出的各个指标计算值, 并根据要求排序和筛选

两个关键点:

  1. 筛选近一个月发布的视频, 两个节点, 一是当下的日期,就是播放记录数据中的最后一天, 二是每个视频发布的日期, 时间差在29天即可
  2. 计算最近无播放天数, 两个节点, 一是当下的日期,就是播放记录数据中的最后一天, 二是每个视频最后一次播放的日期, 求差即可
    select video_id,
           round((100*comp_play_rate + 5*like_cnt + 3*comment_cnt + 2*retweet_cnt) / (days_noplay + 1)) as hot_index
      from (
            select video_id,
                   sum(if(timestampdiff(second, start_time, end_time) >= duration, 1, 0)) / count(start_time) as comp_play_rate,
                   sum(if_like) as like_cnt,
                   sum(if(comment_id is not null, 1, 0)) as comment_cnt,
                   sum(if_retweet) as retweet_cnt,
                   datediff((select max(date(end_time)) from tb_user_video_log), max(date(end_time))) as days_noplay
              from tb_user_video_log
              join tb_video_info using(video_id)
             where date(release_time) >= date_sub((select max(date(end_time)) from tb_user_video_log), interval 29 day)
          group by video_id
      ) as a 
  order by hot_index desc 
     limit 3