题解 | #国庆期间每类视频点赞量和转发量#

国庆期间每类视频点赞量和转发量

https://www.nowcoder.com/practice/f90ce4ee521f400db741486209914a11

#这个题我花了半小时,惭愧,主要是题目中的描述“假设数据库中数据足够多,至少每个类别下国庆头3天及之前一周的每天都有播放记录” 但看他的自测运行的用例的计算结果,好像并不是所有的视频tag都有,那么可能出现国庆三天期间某个类别只有部分日期有数据,这个时候要统计缺失的那一天的数据吗(如果统计的话,那就需要手动添加缺失日期的值,会考虑更多),题目中好像没有说明。

我用了两层。从内向外

第一层:我的总体思路是先把满足要求的记录数据先找出来:连接两个表,在选出,日期范围是 【2021-10-01 前面 6 天 ~ 2021-10-03 】的记录,(我采用了函数去做加减日期的操作,当然你可以直接写字符串效果一样)。然后按照(tag ,天)分组,统计出不同(tag,天)sum(b.if_like) 点赞和sum(b.if_retweet) 转发数。接着开了一个窗,注意开窗的 rows 计算范围 一定是 前6天~当前天的范围,分别用 sum 和max 计算出每个(tag ,天),sum_like_cnt_7d,max_retweet_cnt_7d 的结果。前面两部合并为了一个步骤,所以你会看到 sum(sum(b.if_like)) 这种东西。

这里计算完毕之后切记不要用having 过滤出 10-01~10-03的数据,因为开窗函数执行在having 之后,过滤掉的话会造成开窗结果的错误。

第二层:过滤出10-01~10-03的数据,按要求排序就可以了

#2021 国庆头三天
        #每类视频  每天   近一周总点赞量,   一周内最大单天转发量
select
*
from 
(
    select
        a.tag,
        date_format(b.start_time,'%Y-%m-%d') as dt,
        sum(sum(b.if_like))  over(partition by a.tag order by date_format(b.start_time,'%Y-%m-%d') rows between 6 preceding and current row) as sum_like_cnt_7d,
        max(sum(b.if_retweet))  over(partition by a.tag order by date_format(b.start_time,'%Y-%m-%d') rows between 6 preceding and current row) as max_retweet_cnt_7d
    from tb_video_info a join tb_user_video_log b on a.video_id = b.video_id and date_format(b.start_time,"%Y-%m-%d") >= date_sub('2021-10-01',interval 6 day) and date_format(b.start_time,'%Y-%m-%d') <= date_add('2021-10-01',interval 2 day)
    group by a.tag,date_format(b.start_time,'%Y-%m-%d')
) c
where c.dt >= '2021-10-01' and c.dt <= '2021-10-03'

order by c.tag desc,c.dt

全部评论

相关推荐

04-24 18:13
南京大学 Java
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

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