题解 | #近一个月发布的视频中热度最高的top3视频#
近一个月发布的视频中热度最高的top3视频
https://www.nowcoder.com/practice/0226c7b2541c41e59c3b8aec588b09ff
牛客
SQL161 近一个月发布的视频中热度最高的top3视频
解题思路
盲点 这道题目需要排除没有播放 or 发布时间不在最近一个月的 视频记录
- 需要按照热度公式来处理每个视频
- 首先拆除公式有 完播率、点赞数、评论数、转发数、新鲜度
- 我们已知参数是固定的,所以可以先计算出这几个数值⬆️
- 需要用where来排除发布时间不在近一个月的视频
- 如 最近的播放时间是2021-08-01 12:00:00 往前推一个月是 2021-07-01 00:00:00,但理论上2021-07-01不属于最近一个月,所以再往后推1天是2021-07-02 00:00:00
t1.release_time > ( select date_add ( concat(substr(date_sub (max(end_time), interval 1 month),1,10),' 00:00:00'), interval 1 day ) as max_time from tb_user_video_log )- 可以用join\where的方式排除没有播放量的视频
- 用视频记录表来做join的主表就可以将没有播放记录的视频筛掉
- 当然用where end_time is not null也可以达到效果
- 计算热度时需要考虑点赞、评论、转发为空的数据,以免数据错误
- 如果有null值可以if(col is null , 0 , 1)
- 如果都是数据值可以 sum(col)
#
# (a*视频完播率+b*点赞数+c*评论数+d*转发数)*新鲜度;
# 新鲜度=1/(最近无播放天数+1);
# 当前配置的参数a,b,c,d分别为100、5、3、2。
# round(hot_index,0) or cast(hot_index as SIGNED)
select
video_id,
round(
(
100 * wanbo + 5 * dianzan + 3 * pinglun + 2 * zhuanfa
) * (1 / (wubo + 1)),
0
) as hot_index
from
(
select
t1.video_id,
avg(
if (
unix_timestamp (t2.end_time) - unix_timestamp (t2.start_time) >= duration,
1,
0
)
) as wanbo,
sum(if_like) as dianzan,
sum(if (comment_id is null, 0, 1)) as pinglun,
sum(if_retweet) as zhuanfa,
datediff (
(
select
max(end_time) as max_time
from
tb_user_video_log
),
max(t2.end_time)
) as wubo
from
tb_user_video_log as t2
left join tb_video_info as t1 on t1.video_id = t2.video_id
where
t1.release_time > (
select
date_add (
concat(substr(date_sub (max(end_time), interval 1 month),1,10),' 00:00:00'),
interval 1 day
) as max_time
from
tb_user_video_log
)
group by
t1.video_id
) t
order by
hot_index desc
limit
3;
#sql#
查看10道真题和解析