为什么需要两层 sum

两层sum,一定是要知道它们各个是干嘛的。

[1] 总粉丝量

总粉丝量是不在分组信息内,要的是截至当前月份的总数(不能单纯sum)

[2] 单个sum()

如果是 sum(case a.if_follow when 1 then 1 when 2 then -1 else 0 end)) total_fans 的只是单纯对group by author, month 后的总值取总和,那就不能区分哪个作者哪个月份了,最后得到的行的这一列都是一样的sum值。

所以里面也要内分区

[3] 每个月的总粉丝数

算每个月的总粉丝数时,要将前面月份的数据排在上面,再进行累加

order by 实现了里面的根据月份排序;sum1() 实现了对每单个月的粉丝总和,sum2() over(xxx) 实现了对【内部按月分区后截至到当前月份】按作者分组的粉丝求和。

结果,得到各个月(截止到该月为止)的粉丝数

sum(           sum(case a.if_follow when 1 then 1 when 2 then -1 else 0 end)      ) over(partition by b.author order by date_format(a.start_time, '%Y-%m') ) total_fans     # 套了2层sum [7]
[4] 2层sum

【partition by 字段1 order by 字段2】的意思:

以学院和分数排名为例,如果【partition by department order by score】则是将各个学院的数据,内部再按照分数从高到低排序。

同理,这里的【partition by b.author order by date_format(a.start_time, '%Y-%m')】也是每个用户不同月份的数据依次排开,每一块"用户块"里面,根据月份从上到下排列。

外层 sum() 的原因也可不得而知。

参考资料:

题解榜一

题解榜二