hivesql练习_视频热度问题

发布时间 2023-03-28 21:56:25作者: 娜娜娜娜小姐姐

现有用户视频表(user_video_log)如下。

uid
(用户id)
video_id
(视频id)
start_time
(开始时间)
end_time
(结束时间)
if_like
(是否点赞)
if_retweet
(是否转发)
comment_id
(评论id)
101 2001 2021-09-24 10:00:00 2021-09-24 10:00:20 1 0 null
105 2002 2021-09-25 11:00:00 2021-09-25 11:00:30 0 1 null
102 2002 2021-09-25 11:00:00 2021-09-25 11:00:30 1 1 null
101 2002 2021-09-26 11:00:00 2021-09-26 11:00:30 0 1 null

视频信息表(video_info) 如下:

video_id
(视频id)
author
(作者id)
tag
(标签)
duration
(视频时长)
2001 901 旅游 30
2002 901 旅游 60
2003 902 影视 90
2004 902 美女 90

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

注:热度=(a*视频完播率+b*点赞数+c*评论数+d*转发数)*新鲜度;

新鲜度=1/(最近无播放天数+1);

当前配置的参数a,b,c,d分别为100、5、3、2。

最近播放日期以 end_time(结束观看时间)为准,假设为T,则最近一个月按 [T-29, T] 闭区间统计。

当天日期使用视频中最大的end_time

结果中热度保留为整数,并按热度降序排序。

期望结果如下:

video_id
<int>
(视频id)
heat
<decimal(16,2)>
(热度)
2002 80.36
2001 20.33

 

解答:

 1 with tt as(
 2   SELECT
 3   uvl.video_id,
 4   this_date,
 5   datediff(this_date, max(end_time)) nodays, -- 最近无播放天数
 6   sum(if(unix_timestamp(end_time) - unix_timestamp(start_time) = vi.duration, 1, 0)) / sum(1) uv_rate, --视频完播率
 7   sum(if_like) if_like, --点赞数
 8   sum(if_retweet) if_retweet, --转发数
 9   sum(if(comment_id is null, 0, 1)) if_comment --评论数
10   FROM
11   user_video_log uvl
12   join (select max(end_time) as this_date -- 最新播放日期
13         from user_video_log) td
14   on uvl.end_time >= date_add(this_date, -29) and uvl.end_time <= this_date
15   join video_info vi on uvl.video_id = vi.video_id
16   group by uvl.video_id, this_date
17 ),
18 tt1 as(
19   select video_id,
20   cast((ceil(100 * uv_rate) + 5 * if_like + 3 * if_comment + 2 * if_retweet)/(nodays + 1) as decimal(16, 2)) heat
21   from tt
22 ),
23 tt2 as(
24   select video_id, heat, row_number() over(order by heat desc) rk
25   from tt1
26 )
27 select video_id, heat from tt2 where rk <= 3;