分析函数

SQL 分析函数汇总

一、分析函数语法

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 函数的保留属性,表示分组、排序结果集中第一个、最后一个

你可能感兴趣的:(分析函数)