为什么需要两层 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() 的原因也可不得而知。
参考资料:
题解榜一
题解榜二