一、分析函数语法
function_name(<argument>,<argument>...) over(<partition_Clause><order by_Clause><windowing_Clause>);1
function_name():函数名称
argument:参数
over( ):开窗函数
partition_Clause:分区子句,数据记录集分组,group by…
order by_Clause:排序子句,数据记录集排序,order by…
windowing_Clause:开窗子句,定义分析函数在操作行的集合,三种开窗方式:rows、range、Specifying
注:使用开窗子句时一定要有排序子句!!!
分析函数实例
SELECT e.*, LAST_VALUE(E.SAL) OVER(PARTITION BY E.DEPTNO ORDER BY E.SAL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL FROM scott.EMP E
(RANK() OVER(ORDER BY paymoney DESC)) / (COUNT(1)OVER()
max(t.salary) keep(dense_rank first order by t.bonus + t.salary, mod(t.bonus, 2), t.bonus / t.salary nulls last) over()
二、分析函数汇总
oracle 分析函数实例(在scott用户下模拟)
在线oracle数据库
https://www.oracle.com/technetwork/cn/database/application-development/livesql/index.html
--显示各部门员工的工资,并附带显示该部分的最高工资。
SELECT E.DEPTNO,
E.EMPNO,
E.ENAME,
E.SAL,
LAST_VALUE(E.SAL)
OVER(PARTITION BY E.DEPTNO
ORDER BY E.SAL ROWS
--unbounded preceding and unbouned following 表中的所有记录
--unbounded:不受控制的,无限的
--preceding:在...之前
--following:在...之后
BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
FROM scott.EMP E;
运行结果:
DEPTNO | EMPNO | ENAME | SAL | MAX_SAL |
---|---|---|---|---|
10 | 7934 | MILLER | 1300 | 5000 |
10 | 7782 | CLARK | 2450 | 5000 |
10 | 7839 | KING | 5000 | 5000 |
20 | 7369 | SMITH | 800 | 3000 |
20 | 7876 | ADAMS | 1100 | 3000 |
20 | 7566 | JONES | 2975 | 3000 |
20 | 7788 | SCOTT | 3000 | 3000 |
20 | 7902 | FORD | 3000 | 3000 |
30 | 7900 | JAMES | 950 | 2850 |
30 | 7654 | MARTIN | 1250 | 2850 |
30 | 7521 | WARD | 1250 | 2850 |
30 | 7844 | TURNER | 1500 | 2850 |
30 | 7499 | ALLEN | 1600 | 2850 |
30 | 7698 | BLAKE | 2850 | 2850 |
按照deptno分组,然后计算每组值的总和
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) max_sal
FROM SCOTT.EMP;
运行结果:
EMPNO | ENAME | DEPTNO | SAL | MAX_SAL |
---|---|---|---|---|
7782 | CLARK | 10 | 2450 | 2450 |
7839 | KING | 10 | 5000 | 7450 |
7934 | MILLER | 10 | 1300 | 8750 |
7876 | ADAMS | 20 | 1100 | 1100 |
7902 | FORD | 20 | 3000 | 4100 |
7566 | JONES | 20 | 2975 | 7075 |
7788 | SCOTT | 20 | 3000 | 10075 |
7369 | SMITH | 20 | 800 | 10875 |
7499 | ALLEN | 30 | 1600 | 1600 |
7698 | BLAKE | 30 | 2850 | 4450 |
7900 | JAMES | 30 | 950 | 5400 |
7654 | MARTIN | 30 | 1250 | 6650 |
7844 | TURNER | 30 | 1500 | 8150 |
7521 | WARD | 30 | 1250 | 9400 |
对各部门进行分组,并附带显示第一行至当前行的汇总
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN unbounded preceding AND current row 是指第一行至当前行的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) max_sal
FROM SCOTT.EMP;
运行结果:
EMPNO | ENAME | DEPTNO | SAL | MAX_SAL |
---|---|---|---|---|
7782 | CLARK | 10 | 2450 | 2450 |
7839 | KING | 10 | 5000 | 7450 |
7934 | MILLER | 10 | 1300 | 8750 |
7876 | ADAMS | 20 | 1100 | 1100 |
7902 | FORD | 20 | 3000 | 4100 |
7566 | JONES | 20 | 2975 | 7075 |
7788 | SCOTT | 20 | 3000 | 10075 |
7369 | SMITH | 20 | 800 | 10875 |
7499 | ALLEN | 30 | 1600 | 1600 |
7698 | BLAKE | 30 | 2850 | 4450 |
7900 | JAMES | 30 | 950 | 5400 |
7654 | MARTIN | 30 | 1250 | 6650 |
7844 | TURNER | 30 | 1500 | 8150 |
7521 | WARD | 30 | 1250 | 9400 |
当前行至最后一行的汇总
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN current row AND unbounded following 指当前行到最后一行的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) max_sal
FROM SCOTT.EMP;
当前行的上一行(rownum-1)到当前行的汇总
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN 1 preceding AND current row 指当前行的上一行(rownum-1)到当前行的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME ROWS
BETWEEN 1 PRECEDING AND CURRENT ROW) max_sal
FROM SCOTT.EMP;
当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总
SELECT EMPNO,
ENAME,
DEPTNO,
SAL,
--注意ROWS BETWEEN 1 preceding AND 1 following 是指当前行的上一行(rownum-1)到当前行的下辆行(rownum+2)的汇总
SUM(SAL) OVER(PARTITION BY DEPTNO
ORDER BY ENAME
ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) max_sal
FROM SCOTT.EMP
分析函数包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows)
窗口子句中我们经常用到指定第一行,当前行,最后一行这样的三个属性
第一行是 unbounded preceding
当前行是 current row
最后一行是 unbounded following
窗口子句不能单独出现,必须有order by子句时才能出现
当省略窗口子句时:
a) 如果存在order by则默认的窗口是unbounded preceding and current row --当前组的第一行到当前行
b) 如果同时省略order by则默认的窗口是unbounded preceding and unbounded following --整个组
如果省略分组,则把全部记录当成一个组:
a) 如果存在order by则默认窗口是unbounded preceding and current row --当前组的第一行到当前行
b) 如果这时省略order by则窗口默认为unbounded preceding and unbounded following --整个组
min | max(column1) keep (dense_rank first | last order by column2) over (partition by column3)
dense_rank first,dense_rank last为keep 函数的保留属性,表示分组、排序结果集中第一个、最后一个