题解 | #近一个月发布的视频中热度最高的top3视频#
近一个月发布的视频中热度最高的top3视频
https://www.nowcoder.com/practice/0226c7b2541c41e59c3b8aec588b09ff
#这个题总体来说,正确率很低的原因就是:如果不看它的“解释”,这个题乍一看确实有点奇怪。你说我最近发布的,怎么可能有一个月的播放数据呢。原来作者在“解释”中描述最大的当前时间是tb_user_video_log 中的max(end_time),用这个max(end_time)去找到release_time 在30天内的video,再用这个结果去join tb_user_video_log 表。
fresh rate 这个 一定要用 end_time 我他妈找半天,就是这里用错了,写成了start_time 导致错误
第一层计算基本计算需要的字段,第二层计算统计结果,分两层的目的主要是为了让 语句看起来更简单一点
select d.video_id, format((100*d.disFullRate + 5*d.likeNum + 3*d.commNum + 2*d.retweetNum)*d.freshRate,0) as hot_index from ( select a.video_id,avg(case when (UNIX_TIMESTAMP(a.end_time) - unix_timestamp(a.start_time)) >= c.duration then 1 else 0 end) as disFullRate, sum(a.if_like) as likeNum, sum(case when a.comment_id is not null then 1 else 0 end) as commNum, sum(if_retweet) as retweetNum, 1/(datediff(max(b.end_time),max(a.end_time)) + 1) as freshRate from (select max(end_time) as end_time from tb_user_video_log) b join tb_video_info c on date_format(c.release_time,'%Y%m%d') >= date_format(date_sub(b.end_time, interval 29 day),'%Y%m%d') join tb_user_video_log a on a.video_id = c.video_id group by a.video_id ) d order by hot_index*1 desc limit 3