题解 | #SQL 4.每个创作者每月的涨粉率及截止当前的总粉丝量#

每个创作者每月的涨粉率及截止当前的总粉丝量

http://www.nowcoder.com/practice/d337c95650f640cca29c85201aecff84

每个创作者每月的涨粉率及截止当前的总粉丝量

明确题意:

计算2021年里每个创作者每月的涨粉率及截止当月的总粉丝量,涨粉率=(加粉量 - 掉粉量) / 播放量。结果按创作者ID、总粉丝量升序排序


问题分解:

  • 关联用户-视频互动记录和短视频信息表:JOIN tb_video_info USING(video_id);
  • 筛选2021年的记录:where YEAR(start_time) = 2021
  • 计算每个创作者每个月的涨粉量和播放量:
    • 按创作者和月份分组:group by author, DATE_FORMAT(start_time, "%Y-%m")
    • 计算涨粉量(特殊情况if_follow=2时表示掉粉):sum(if(if_follow=2, -1, if_follow)) as fans_add_cnt
    • 计算播放量(每条记录就是一次播放):count(1) as play_cnt
  • 计算每个创作者每个月的涨粉量和播放量:
    • 计算涨粉率,保留3位小数:round(fans_add_cnt / play_cnt, 3)
    • 计算截止当月的总粉丝量(累积求和):sum(fans_add_cnt) over(partition by author order by month)

细节问题:

  • 表头重命名:as

完整代码:

select author, `month`, round(fans_add_cnt / play_cnt, 3) as fans_growth_rate,
    sum(fans_add_cnt) over(partition by author order by `month`) as total_fans
from (
    select author,
        DATE_FORMAT(start_time, "%Y-%m") as `month`,
        sum(if(if_follow=2, -1, if_follow)) as fans_add_cnt,
        count(1) as play_cnt
    from tb_user_video_log
    join tb_video_info USING(video_id)
    where YEAR(start_time) = 2021
    group by author, `month`
) as t_author_monthly_fans_play_cnt
order by author, total_fans;
SQL大厂真题 文章被收录于专栏

大厂真题手把手教你怎么解~

全部评论
这个真为了答案而答案,如果粉丝总数有到5在变回3呢,那么这个过程就是错的
点赞 回复 分享
发布于 2024-06-13 16:32 广东
这种统计方法简单明了,比sum(sum()) over()容易理解。很少见sum(sum()) over(),还是我见识少了?
点赞 回复 分享
发布于 2022-05-23 23:49
sum(if(if_follow=2, -1, if_follow)) as fans_add_cnt 这一句不是已经求和了吗 为什么sum(fans_add_cnt) over(partition by author order by month)这个地方又求了一遍和
点赞 回复 分享
发布于 2022-02-15 17:10

相关推荐

07-17 12:09
门头沟学院 Java
讲的口干舌燥,头都晕了怎么要讲这么长啊
码农索隆:没事,你口干舌燥,他不一定会看,
投递小鹏汽车等公司7个岗位
点赞 评论 收藏
分享
零OFFER战士:另一个版本查看图片
点赞 评论 收藏
分享
昨天 18:37
门头沟学院 Java
点赞 评论 收藏
分享
评论
74
10
分享

创作者周榜

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