1. 场景描述
做了十几年Java开发,sql水平还是很一般啊,今天碰到要做个统计堆积百分比的,因为sql本身已经已经很复杂了,想着在Java中通过stream来实现,弄了半天也没搞定,回头又想着用sql搞定,groupby了半天出不来,很郁闷,找数仓组的帮忙看了下,一下子就搞定了,用了over函数,以前没用过,记录下吧。
2. 解决方案
2.1 项目问题解决
想要的效果是:按照某列进行分组,然后把另一列的值累加起来,然后再去获得百分比。
具体sql就不贴出来了,就贴下具体用到的地方吧。
round(
b1 * 100 / SUM (b1) OVER (PARTITION BY a1),
2
) as b1,
执行是按照a1列分组,然后按照b1列汇总,然后获取b1列中每个值占的百分比。
2.2 问题解析
OVER(PARTITION BY)函数介绍, Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是:对于每个组返回多行,而聚合函数对于每个组只返回一行,只有oracle和postgreSQL有 OVER(PARTITION BY)功能,mysql没有。
官方文档:
看了官方文档,关于开窗函数看的还不是非常懂,好吧,不看了,就把这个作为解决问题到此为止了。
更多知识请关注公众号:「软件老王」,IT技术与相关干货分享,回复关键字获取对应干货,java,送必看的10本“武功秘籍”;图片,送100多万张可商用高清图片;面试,送刚毕业就能月薪“20k”的java面试题,后续不断更新中,比如“软考”、“工具”等,已经在整理中。