窗口函数_解决SQL累加问题 业务场景1:求出每月数量(amount)的累计值
这个需求在Excel里面是非常好实现的,一个求和公式直接搞定,但Excel处理的数据量毕竟有限,这个需求在SQL里,怎么来实现呢?——窗口函数。 窗口函数 1、累计求和 基础结构:sum(…) over(…) 复杂结构:sum(…) over(partition by … order by … rows between … and …) 上面省略号(…)位置所替代的信息:sum(需要求和的列名);partition by 需要分组的列名;order by 需要排序的列名:默认升序(asc),降序为desc;rows between 参与计算的行起始位置 and 参与计算的行终止位置;over括号中的那些,注:over括号中那些,如果没有相应需求,可以省略; $包括本行和前3行:rows between 6 preceding and current row (如季度求和) $包括本行和后3行:rows between current row and 3 following $包括本行和之前所有的行:rows between unbounded preceding and current row $包括本行和之后所有的行:rows between current row and unbounded following $从前5行到下1行(总共包含7行数据):rows between 5 preceding and 1 following 例:对2019年和2020年的数量总额按月累计,按年汇总
2、其他聚合类的窗口函数 平均:avg(…) over(partition by … order by … rows between … and …)(如股票中的7日移动平均) 计数:count(…) over(partition by … order by … rows between … and …) 最大:max(…) over(partition by … order by … rows between … and …) 最小:min(…) over(partition by … order by … rows between … and …) 3、排序类的窗口函数 为查出来的每一行生成一个序号row_number() over( partition by … order by …):序号连续不重复dense_rank() over(partition by … order by …):序号连续,如有两个第一时,紧接着还是第二:rank() over(partition by … order by …):序号跳跃的,如有两个第一,接着就是第三 注:省略号同上,row_number()这个括号里不需要添加字段名,其他两个同样; mysql中没有现成的位移函数,可以借助添加序号辅助列,求上下两行的差值 业务场景2:请求出2020年每月总的新增量(下表中2019-12-31,表示从开始(时间未知)到2019-12-31的累计值)
4、平均分组(切片类的)窗口函数 ntile(n) over(partition by …order by …): 返回每行数据当前所在的切片值(即按指定顺序,被分到第几组) n:表示把数据分成几组,数据不能均分时,前面组的数据多 业务场景3:求充值排名前25%的用户(假设user_name唯一)
思路:前25%,就是平均分成4份,取第一份 5、位移函数(mysql不支持) 取出同一字段前/后n行的数据,作为单独的列前N行:lag(str,N,default) over(partition by …order by …)后N行:lead(str,N,default) over(partition by …order by …) str:表示字段名,要取哪一列的数据; N:表示偏移量,取前/后第几行的数据,默认为1; default:当取值时,前/后N行已经超出表的范围,或者是没有,这种情况下的默认返回值,不指定的话,返回null; 像前面的业务场景2中,需要计算上下两行数据的差值,就可以用这种位移函数;
2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/46811.html