0.序言 ----独自奋斗不靠别人
参加工作以来,经常受业务之托统计数据报表,偶尔也会遇到十分复杂的统计逻辑,面对当前眼花缭乱的表结构,常常束手无策,即使绞尽脑汁,写出脚本,也会受限于较差的执行效率。回想起,数年前,在某家保险公司任职时,曾接触到Oracle的分析函数,一直为其强大的功能所折服,近年来,也多次在工作中使用到分析函数,而自己也从对分析函数的不甚了解,逐渐开始变得去潜心研究它,甚感其博大精深。面对复杂的业务逻辑,我也曾多次在分析函数中找到解决方案。所以,简单查了些资料,略微整理之,和大家共同研究学习。以求为大家使用提供参考。
1.分析函数是什么?
分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。
2.分析函数和聚合函数的不同之处是什么?
普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值。
3.举例:建库
初始化数据:
一、RANK() OVER()函数
注意rank列的值即为排名,且生日相同的学生在同一班级排名相同,属于跳跃式排名,比如有两个第一,那么没有第二,直接就是第三。
二、DENSE_RANK() OVER()函数
注意rank列的值即为排名,且生日相同的学生在同一班级排名相同,属于非跳跃式排名,比如有两个第一,接下来还是第二。
三、ROW_NUMBER() OVER函数
注意rank列的值即为排名,即使两个数据相同,排名也不一样。
实战演练:查出每个班级年龄最大的一名学生。
四、GROUP BY函数的高级用法:ROLLUP函数与CUBE函数
Oracle的GROUP BY语句除了最基本的语法外,还支持ROLLUP和CUBE语句。如果是Group by ROLLUP(A, B, C)的话,首先会对(A、B、C)进行GROUP BY,然后对(A、B)进行GROUP BY,然后是(A)进行GROUP BY,最后对全表进行GROUP BY操作。
如果是GROUP BY CUBE(A, B, C),则首先会对(A、B、C)进行GROUP BY,然后依次是(A、B),(A、C),(A),(B、C),(B),( C ),最后对全表进行GROUP BY操作。
貌似下面的显示颠倒过来了。
加一个关键字看着就顺眼多了。(__) 嘻嘻……
五、grouping函数
在以上例子中,是用rollup和cube函数都会对结果集产生null,这时候可用grouping函数来确认该记录是由哪个字段得出来的。
grouping函数用法,带一个参数,参数为字段名,结果是根据该字段得出来的就返回1,反之返回0
六、Lag和Lead函数
Lag和Lead分析函数可以在同一次查询中取出同一字段的后N行的数据(Lag)和前N行的数据(Lead)作为独立的列。这种操作可以代替表的自联接,并且LAG和LEAD有更高的效率。
语法:lag(exp_str,offset,defval) over() 或Lead(exp_str,offset,defval) over()
–exp_str要取的列 --offset取偏移后的第几行数据 --defval没有符合条件的默认值
欢迎大家评论交流学习心得!