此书及其相关资源下载方法:关注微信公众号,点击功能介绍-书籍链接下载,即可获取
说明
本文主要介绍如下:
- 9.1.1 什么是分析函数
- 9.1.2 基本语法
- 9.1.3 分析函数结构
- 9.1.4 分析函数列表
9.1.1 什么是分析函数
尽管SQL语句非常强大,但是各种情形的出现,并不能完全满足日常开发,例如:找出同一个部门的工资总和与其他信息并排显示,但只使用一张表
9.1.2 基本语法
语法
FUNCTION_NAME (<argument>,<argument>. . . )
OVER
(<Partition-Clause><Order—by—Clause><windowing Clause>)
语法说明
- FUNCTION_NAME:用于指定分析函数名,Oracle 提供了 26 个分析函数,比如
SUM、 COUNT、 AVG、 MIN、 MAX 及 ROW_NUMBER 等.- <argument>: 用于指定分析函数的参数, 每个函数可以有0~3 个参数,参数可 以
是列名或表达式, 比如 SUM(saI+comm)这样的形式.- OVER:是一个关键字,用于标识分析函数,否则查询分析器不能区别比如 SUM
是分组函数还是一个分析函数.- <Patition_Clause>: 分区子句是可选的分区于句,如果不存在任何分区于句, 则
全部的结果集可看作一个单一的大区.- <Order_by-Clause>: 可选的排序子句, 用来根据结果集进行排序.
- <Wind0wing Clause>: 用于定义分析函数将在其上操作的行的集合, 该子句给出了
一个定义变化或固定的数据窗口的方法, 分析函数将对这些数据进行操作.
9.1.3 分析函数结构
1.分析函数名
(1)等级函数:用于寻找前N,如ROW_NUMBER,RANK,DENSE_BANK函数
SELECT s.deptno,
s.job,
SUM(s.sal) AS sum_sal,
rank() over(ORDER BY SUM(s.sal) DESC) AS 薪资等级,
row_number() over(PARTITION BY s.deptno ORDER BY SUM(s.sal) DESC) AS 分组行号,
SUM(SUM(s.sal)) over(PARTITION BY s.deptno ORDER BY s.job) 部门薪资运行总计
FROM scott.emp s
WHERE s.deptno IN (10, 20, 30)
AND s.job IS NOT NULL
GROUP BY s.deptno, s.job;
(2)开窗函数:SUM、 COUNT、 AVG、 MIN 和 MAX 等
(3)制表函数:与开窗函数的区别是作用于整个分区或者组,MIN, MAX,SUM,COUNT,AVG等
(4)LEG和LEAD函数:允许结果集中向前或后检索值,如果避免数据的自连接可以用到
(5)统计函数:VAR_POP,VAR_SAMP和SRDEV_POP及线性的衰减函数等,计算任何未排序的统计值
2.分区子句
分区子句使用 PARTlTION BY 关键宇, 用来将一个简单的结果集分为N组,分区与
组的概念比较相似′在语法上与 SQL查询的 GROUP BY子句很相似, 如下所示。
PARTITION BY expression <, expression> <, expression>
SELECT s.deptno,
s.empno,
s.ename,
row_number() over(PARTITION BY s.deptno ORDER BY s.empno DESC) AS 分组行号
FROM scott.emp s
WHERE s.deptno IN (10, 20, 30)
AND s.job IS NOT NULL;
3.排序子句
ORDER BY expression <ASCIDESC> (NULLS FIRSTINULLS LAST>,
- asc|desc:指定排序顺序 〈升序或降序) 。 asc 是默认值
- nulls first|nulls last:指定若返回行包含空值, 该值应该出现在排序序列的开始还是末尾
4.开窗子句
--rows BETWEEN unbounded preceding AND unbounded following:从首列到末尾所有的记录
SELECT deptno,
SUM(sal) AS 部门薪资小计,
SUM(SUM(sal)) over(ORDER BY deptno rows BETWEEN unbounded preceding AND unbounded following) AS 部门总计
FROM scott.emp
GROUP BY deptno
9.1.4 分析函数列表
1.COUNT函数
语法:COUNTH(| [DISTINCT | ALL] expr}) OVER (analytic_clause)
2.sum函数
语法:SUM ( [ DISTINCT | ALL ] expr ) OVER ( analytic_clause )
3.AVG函数
语法:AVG([DISTINCTIALL] expr) OVER(analytic_clause)
4.MAX和MIN函数
语法:MAX (col) OVER (analytic_clause)
MIN (col) OVER (analytic_clause)
5.RANK和DENSE_RANK ,ROW_NUMBER函数
语法:RANK” OVER([partition_clause] order_by_clause)
DENSE_RANK () OVER([partition_clause] order_by_clause)
ROW_NUMBER () OVER([partition_clause] order_by_clause)
6.FIRST和LAST函数
语法:KEEP
(DENSE_RANK FIRST ORDER BY
expr [DESC|ASC]
[NULLS ( FIRST | LAST}]
[, expr [DESC IASC]
[NULLS ( FIRST | LAST}]
] . . .
)
[OVER query_partition_clause] ;
7.FIRST_VALUE和LAST_VALUE函数
语法:FIRST_VALUE (col) OVER ( analytic_clause )
LAST_VALUE (col) OVER ( analytic_clause )
8.LAG和LEAD 函数
语法:LAG (col [,n] [,n]) over( [partition_c1ause] order_by_clause)
LEAD (col [, n] [, n]) over ( [partition_clause] order_by_c1ause)