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

题目详情见牛客

计算2021年里每个创作者每月的涨粉率及截止当月的总粉丝量

思路题解

SELECT
    t2.author,
    t2.月份,
    t2.fans_growth_rate,
    sum(t2.每月总的涨粉量) over (PARTITION BY t2.author ORDER BY t2.月份) AS "总粉丝数目" 
FROM
    (
    SELECT
        t1.author,
        t1.月份,
        ROUND(SUM(CASE t1.点关注 WHEN 1 THEN 1 WHEN 2 THEN - 1 ELSE NULL END) / COUNT(t1.点关注), 3) AS "fans_growth_rate",
        SUM(CASE t1.点关注 WHEN 1 THEN 1 WHEN 2 THEN - 1 ELSE NULL END) AS "每月总的涨粉量" 
    FROM
        (
        SELECT
            a.author,
            b.if_follow AS "点关注",
            DATE_FORMAT(b.start_time, '%Y-%m') AS "月份" 
        FROM
            tb_video_info AS a
            LEFT JOIN tb_user_video_log AS b ON a.video_id = b.video_id 
        WHERE
            YEAR(b.start_time) = 2021 
        ) AS t1 
    GROUP BY
        t1.author,
        t1.月份 
    ) AS t2 
ORDER BY
    t2.author ASC, t2.月份 ASC;

1 第一步 找到21年的数据

 SELECT
            a.author,
            b.if_follow AS "点关注",
            DATE_FORMAT(b.start_time, '%Y-%m') AS "月份" 
        FROM
            tb_video_info AS a
            LEFT JOIN tb_user_video_log AS b ON a.video_id = b.video_id 
        WHERE
            YEAR(b.start_time) = 2021 

第二步 把上一段得到的表作为t1,找到21年的每个月的涨粉率和每月总的涨粉量

(第一步和第二步是可以的合并,这里为了思路解析清晰)

SELECT
        t1.author,
        t1.月份,
        ROUND(SUM(CASE t1.点关注 WHEN 1 THEN 1 WHEN 2 THEN - 1 ELSE NULL END) / COUNT(t1.点关注), 3) AS "fans_growth_rate",
        SUM(CASE t1.点关注 WHEN 1 THEN 1 WHEN 2 THEN - 1 ELSE NULL END) AS "每月总的涨粉量" 
    FROM t1
    GROUP BY
        t1.author,
        t1.月份 

第三步,继续把上段表看作t2,考察窗口函数累计问题

SELECT
    t2.author,
    t2.月份,
    t2.fans_growth_rate,
    sum(t2.每月总的涨粉量) over (PARTITION BY t2.author ORDER BY t2.月份) AS "总粉丝数目" 
FROM t2 
ORDER BY
    t2.author ASC, t2.月份 ASC;

这里核心是把t2.每月总的涨粉量按照每个作者分组,进行每个月的顺序累加

sum(t2.每月总的涨粉量) over (PARTITION BY t2.author ORDER BY t2.月份) AS    "总粉丝数目"

|窗口函数详情知识点参考++++》猴子分析| |

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值