SQL中累计求和与滑动求和函数sum() over()用法
sum()函数的升级用法,开窗函数(也叫分析函数)sum() over()一般有三种用法:
a、分组求和
b、累计求和
c、滑动求和
我们以一个案例分别看下三种求和场景的SQL代码写法:
一、数据样本
我们的数据样本为一个名叫dws_js_team_gmv的底表,2个表字段依次为team_name(销售团队)、month(月份)、gmv(成交额)
二、3种求和场景的SQL代码写法
2.1、题目:请统计各销售团队年累计成交额,及各销售团队各月成交额对累计成交的贡献占比
解题思路:只是分组求和的话sum()就能实现,按题目要求,需要实现分组求和的同时又保留目前的数据行数,因此考虑在查取已有字段的基础上增加分组求和值
SQL逻辑:
SELECT team_name --团队 ,month --统计月份 ,gmv --当月成交额 --对gmv按照team_name分组求和,相当于小组gmv的小计 ,SUM(gmv) OVER(partiton by team_name) AS pay_amt --销售组累计成交额 ,gmv/SUM(gmv) OVER(partiton by team_name) gmv_rate --该月成交额占比 FROM dws_js_team_gmv GROUP BY team_name --如果只是求单独的各销售团队成交额,那用sum()就能实现,以上需求和分组求和的差异是既要分组求和还需要保留分月数据 SELECT team_name,SUM(gmv) AS pay_amt FROM dws_js_team_gmv GROUP BY team_name
SQL跑数结果:
2.2、题目:请统计各销售团队在各月的累计业绩值,开始时间从1月算
解题思路:只是分组求和的话sum()就能实现,按题目要求,需要实现分组求和的同时又保留目前的数据行数,因此考虑在查取已有字段的基础上增加分组求和值
SQL逻辑:
SELECT team_name --团队 ,month --统计月份 ,gmv --当月成交额 --对gmv按照team_name分组,再按month累计求和,order by 默认是升序排序,需要降序末尾加DESC ,SUM(gmv) OVER(partiton by team_name order by month) AS pay_amt --销售组累计成交额 FROM dws_js_team_gmv GROUP BY team_name --如果只是求单独的各销售团队成交额,那用sum()就能实现,以上需求和分组求和的差异是既要分组求和还需要保留分月数据 SELECT team_name,SUM(gmv) AS pay_amt FROM dws_js_team_gmv GROUP BY team_name
2.3、题目:请统计各销售团队在各月时的近3个月累计业绩(含统计月)。
2.4、题目:请统计各销售团队在各月时的近3个月累计业绩(不含统计月)。
2.5、题目:请统计各销售团队在各月及其之后2个月的累计业绩,如3月则统计3、4、5这三个月的成交额。
解题思路:以上三题共性是都要做分组且需要根据统计月份滑动求和,先对其做分组后的滑动求和,再调参设置滑动的范围,需要在over函数中使用range between and指定窗口的大小,向前使用preceding,向后使用following。如2 preceding and 1 following指定的窗口包括当前行、当前行前面两行以及当前行后面一行,总共4行。
SQL逻辑:
近3个月累计业绩(含统计月)值的滑动范围参数我们可以写成“range between 2 preceding and 0 following”或“range between 2 preceding and current row”
SELECT team_name --团队 ,month --统计月份 ,gmv --当月成交额 --对gmv按照team_name分组求和,相当于小组gmv的小计 ,SUM(gmv) OVER(partiton by team_name order by month range between 2 preceding and 0 following) AS pay_amt --销售组累计成交额 FROM dws_js_team_gmv GROUP BY team_name --如果只是求单独的各销售团队成交额,那用sum()就能实现,以上需求和分组求和的差异是既要分组求和还需要保留分月数据 SELECT team_name,SUM(gmv) AS pay_amt FROM dws_js_team_gmv GROUP BY team_name
如果希望滑动求和不包含统计月的值,有三种实现思路:
①用近4个月的滑动求和(含统计月)-统计月的值;
②将滑动区间参数配置成“range between 3 preceding and 1 preceding”
③将滑动区间参数配置成“range between 3 preceding and -1 following”