精华内容
下载资源
问答
  • STDDEV()函数功能描述: 计算当前行关于组的标准偏离。(Standard Deviation) STDDEV_SAMP()函数功能描述: 该函数计算累积样本标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同。 区别:当...

    一、方差与标准差

    /*
    STDDEV()函数功能描述:
    计算当前行关于组的标准偏离。(Standard Deviation)
    STDDEV_SAMP()函数功能描述:
    该函数计算累积样本标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同。
    区别:当计算的输入数据只有一行时,stddev()返回0,而stddev_samp()返回null。
    */
    --例子:
    SELECT deptno,
           STDDEV (sal)  AS "STDDEV",               --标准差
           STDDEV_SAMP (sal) AS "STDDEV_SAMP",      --样本标准差
           VAR_POP (sal) AS "VAR_POP",              --方差
           VAR_SAMP (sal)  AS "VAR_SAMP"            --样本方差
    FROM scott.emp
    GROUP BY deptno;

    二、协方差

           E[(X-E(X))(Y-E(Y))]称为随机变量X和Y的协方差,记作COV(X,Y),即:COV(X,Y)=E[(X-E(X))(Y-E(Y))]。若两个随机变量X和Y相互独立,则COV(X,Y)=0,因而若上述数学期望不为零,则X和Y必定不是相互独立的,亦即他们之间存在着一定的联系。

    /*
    COVAR_POP功能描述:
    返回一对表达式的总体协方差。
    COVAR_SAMP功能描述:
    返回一对表达式的样本协方差
    */
    --例子:
    SELECT
         a.department_id,
         a.employee_id,
         b.employee_id manager_id,
         a.first_name||' '||a.last_name employee_name,
         b.first_name||' '||b.last_name manager_name,  
         a.hire_date,
         a.salary employee_salary,
         b.salary manager_salary,
         COVAR_POP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) 
         AS CUM_COVP,  --总体协方差
         COVAR_SAMP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date )
         AS CUM_SAMP   --样本协方差
    FROM employees a,employees b
    WHERE a.manager_id=b.employee_id(+);

    展开全文
  • Oracle数据库中,标准偏差计算结果与variance用作集聚函数计算结果的平方根相等。该函数参数可取任何数字类型或是任何能隐式转换成数字类型的非数字类型。 */ /* STDDEV 功能描述:计算当前行关于组的标准偏离。...

    1. 方差、标准差

    引言:

      样本中各数据与样本平均数的差的平方和的平均数叫做样本方差;样本方差的算术平方根叫做样本标准差。样本方差和样本标准差都是衡量一个样本波动大小的量,样本方差或样本标准差越大,样本数据的波动就越大。

      方差是标准差的平方

      方差和标准差。方差和标准差是测算离散趋势最重要、最常用的指标。方差是各变量值与其均值离差平方的平均数,它是测算数值型数据离散程度的最重要的方法。标准差为方差的平方根,用S表示。

    /*
    stddev返回expr的样本标准偏差。它可用作聚集和分析函数。
    与stddev_samp的不同之处在于,当计算的输入数据只有一行时,stddev返回0,而stddev_samp返回null。
    Oracle数据库中,标准偏差计算结果与variance用作集聚函数计算结果的平方根相等。该函数参数可取任何数字类型或是任何能隐式转换成数字类型的非数字类型。
    */
    /*
    STDDEV
    功能描述:计算当前行关于组的标准偏离。(Standard Deviation)
    STDDEV_SAMP
    功能描述:该函数计算累积样本标准偏离,并返回总体变量的平方根,其返回值与VAR_POP函数的平方根相同。
    */
    --sample:
    SELECT deptno,
           ename,                     --st_name || ' ' || last_name employee_name,
           hiredate,
           sal,
           STDDEV (sal) OVER (PARTITION BY deptno ORDER BY hiredate) 
           AS "STDDEV",                                                 --标准差
           STDDEV_SAMP (sal) OVER (PARTITION BY deptno ORDER BY hiredate)
           AS "STDDEV_SAMP",                                            --样本标准差
           VAR_POP (sal) OVER (PARTITION BY deptno ORDER BY hiredate)
           AS "VAR_POP",                                                --方差
           VAR_SAMP (sal) OVER (PARTITION BY deptno ORDER BY hiredate)
           AS "VAR_SAMP"                                                --样本方差FROM scott.emp
    WHERE deptno IN (20);
    
    SELECT deptno,
           STDDEV (sal)  AS "STDDEV",               --标准差
           STDDEV_SAMP (sal) AS "STDDEV_SAMP",      --样本标准差
           VAR_POP (sal) AS "VAR_POP",              --方差
           VAR_SAMP (sal)  AS "VAR_SAMP"            --样本方差
    FROM scott.emp
    group  by deptno;

    2. 协方差

    引言:

      协方差分析是建立在方差分析和回归分析基础之上的一种统计分析方法。

      方差分析是从质量因子的角度探讨因素不同水平对实验指标影响的差异。一般说来,质量因子是可以人为控制的。

      回归分析是从数量因子的角度出发,通过建立回归方程来研究实验指标与一个(或几个)因子之间的数量关系。但大多数情况下,数量因子是不可以人为加以控制的。

      两个不同参数之间的方差就是协方差

      若两个随机变量X和Y相互独立,则E[(X-E(X))(Y-E(Y))]=0,因而若上述数学期望不为零,则X和Y必不是相互独立的,亦即它们之间存在着一定的关系。
    定义

    E[(X-E(X))(Y-E(Y))]称为随机变量X和Y的协方差,记作COV(X,Y),即COV(X,Y)=E[(X-E(X))(Y-E(Y))]。

    /*
    COVAR_POP
    功能描述:返回一对表达式的总体协方差。
    */
    /* 
    COVAR_SAMP
    功能描述:返回一对表达式的样本协方差
    */ 
    --sample:
    SELECT
         a.department_id,
         a.employee_id,
         b.employee_id manager_id,
         a.first_name||' '||a.last_name employee_name,
         b.first_name||' '||b.last_name manager_name,  
         a.hire_date,
         a.salary employee_salary,
         b.salary manager_salary,
         COVAR_POP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date ) 
         AS CUM_COVP,  --总体协方差
         COVAR_SAMP(a.salary,b.salary) OVER (ORDER BY a.department_id,a.hire_date )
         AS CUM_SAMP   --样本协方差
    FROM employees a,employees b
    WHERE a.manager_id=b.employee_id(+)
    展开全文
  • Oracle分析函数汇总(超全)

    万次阅读 2019-09-13 11:13:28
    前半部分数据源为Oracle自带HR用户下的员工信息表:EMPLOYEES,若创建库的时候未勾选创建示例,可以在这下载sql文件,创建相关表及数据源。(百度网盘链接:https://pan.baidu.com/s/1axlyRjfEGi0pOi8xmRewrA 密码:...

    前半部分数据源为Oracle自带HR用户下的员工信息表:EMPLOYEES,若创建库的时候未勾选创建示例,可以在这下载sql文件,创建相关表及数据源。(百度网盘链接:https://pan.baidu.com/s/1axlyRjfEGi0pOi8xmRewrA   密码:t3yy)

    中间部分的数据源为Oracle自带SCOTT用户下的员工表&部门表:EMP、DEPT

    后半部分属于转载,暂无数据源,但是方便归纳总结:https://blog.csdn.net/cc_0101/article/details/80884076

     

    --1、查询各个部门的平均工资,以及该部门的员工信息

    SELECT 
    	A.MANAGER_ID,A.EMPLOYEE_NAME,A.HIRE_DATE,A.SALARY,B.AVG_SALARY
    FROM
    	(SELECT MANAGER_ID,FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, HIRE_DATE, SALARY FROM EMPLOYEES) A,
    	(SELECT MANAGER_ID,AVG(SALARY) AVG_SALARY FROM EMPLOYEES GROUP BY MANAGER_ID) B
    WHERE A.MANAGER_ID=B.MANAGER_ID
    ORDER BY A.MANAGER_ID;
    
    SELECT 
    	MANAGER_ID,FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME,HIRE_DATE,SALARY,
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID) AVG_SALARY
    FROM EMPLOYEES;
    

    --2、按照入职时间排序,并计算第一个员工到当前员工的平均工资(如果时间一样则相同时间一起计算)

    SELECT 
    	MANAGER_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, HIRE_DATE, SALARY, 
    	AVG(SALARY) OVER (ORDER BY HIRE_DATE)
    FROM EMPLOYEES;

    --3、按照入职时间排序,且按照部门经理进行分组,并计算该部门第一个员工到当前员工的平均工资(如果时间一样则相同时间一起计算)

    SELECT 
    	MANAGER_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, HIRE_DATE, SALARY, 
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID ORDER BY HIRE_DATE)
    FROM EMPLOYEES;

    --ROWS表示行
    --4、按照入职时间排序,且按照部门经理进行分组,计算当前员工的前一个到后两个共四个员工的平均工资(如果时间一样,则默认按照先后顺序计算)

    SELECT 
    	MANAGER_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, HIRE_DATE, SALARY, 
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID ORDER BY HIRE_DATE ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING)
    FROM EMPLOYEES;

    --RANGE表示取值范围(数字和日期可以取值)
    --5、按照入职时间排序,且按照部门经理分组,计算当前员工雇佣时间之前的50天以内,之后的150天以内之间的平均工资(未验证前50,后150的边界问题)

    SELECT 
    	MANAGER_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, HIRE_DATE, SALARY,
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID ORDER BY HIRE_DATE RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING)
    FROM EMPLOYEES;

    /*窗口子句中我们经常用到指定第一行,当前行,最后一行这样的三个属性:
    第一行是 unbounded preceding,
    当前行是 current row,
    最后一行是 unbounded following*/

    --求平均做一个总结,并展示第一个到最后一个的取值方法

    SELECT 
    	MANAGER_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, HIRE_DATE, SALARY,
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID ORDER BY HIRE_DATE) AVG_SALARY_PART_ORDER,--累计求平均,和第3个一样
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID ) AVG_SALARY_ORDER,--求整个部门的平均,和第1个一样
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID ORDER BY HIRE_DATE RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AVG_SALARY_UNBOUND1, --求整个部门的平均,表示取值范围第一个到最后一个,结果和上面一致
    	AVG(SALARY) OVER (PARTITION BY MANAGER_ID ORDER BY HIRE_DATE ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) AVG_SALARY_UNBOUND2--求整个部门的平均,行号取值范围第一个到最后一个,结果和上面一致
    FROM EMPLOYEES;
    --按照deptno分组,然后计算当前行至最后一行的汇总
    SELECT 
    	EMPNO,ENAME,DEPTNO,SAL,
    	SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) MAX_SAL
    FROM EMP;
    
    
    --按照deptno分组,然后计算当前行的上一行(rownum-1)到当前行的汇总
    SELECT 
    	EMPNO,ENAME,DEPTNO,SAL,
        SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME ROWS BETWEEN 1 PRECEDING AND CURRENT ROW) MAX_SAL
    FROM EMP;
    
    
    --按照deptno分组,然后计算当前行的上一行(rownum-1)到当前行的下两行(rownum+2)的汇总
    SELECT 
    	EMPNO,ENAME,DEPTNO,SAL,
        SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING) MAX_SAL
    FROM EMP;
    --注意ROWS BETWEEN 1 preceding AND 1 following 是指当前行的上一行(rownum-1)到当前行的下两行(rownum+2)的汇总

     

    --MIN、MAX、AVG、SUM、COUNT

    SELECT 
    	DEPARTMENT_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, HIRE_DATE, SALARY,
    	MIN(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY HIRE_DATE) AS DEPT_MIN,--按照部门ID分组,然后按照入职时间排序,计算包括当前员工入职时间及之前的所有员工的最低薪资(如果时间一样,则一起计算)
    	MAX(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY HIRE_DATE) AS DEPT_MAX,--按照部门ID分组,然后按照入职时间排序,计算包括当前员工入职时间及之前的所有员工的最高薪资(如果时间一样,则一起计算)
    	AVG(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY HIRE_DATE) AS DEPT_AVG,--按照部门ID分组,然后按照入职时间排序,计算该部门第一个员工到当前员工的平均工资(如果时间一样则相同时间一起计算)
    	SUM(SALARY) OVER (PARTITION BY DEPARTMENT_ID ORDER BY HIRE_DATE) AS DEPT_SUM,--按照部门ID分组,然后按照入职时间排序,计算该部门第一个员工到当前员工的工资和(如果时间一样则相同时间一起计算)
    	COUNT(1) OVER (ORDER BY SALARY) AS COUNT_BY_SALARY,--按照工资进行排序,统计从第一个到当前工资的个数(如果工资一样,则一起统计)
    	COUNT(1) OVER (ORDER BY SALARY RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING) AS COUNT_BY_SALARY_RANGE--按照工资进行排序,统计比当前工资小50到比当前工资大150的个数
    FROM EMPLOYEES;

    --RANK、DENSE_RANK
    /*row_number的用途非常广泛,排序最好用它,它会为查询出来的每一行记录生成一个序号,依次排序且不会重复,注意使用row_number函数时必须要用over子句选择对某一列进行排序才能生成序号。

    rank函数用于返回结果集的分区内每行的排名,行的排名是相关行之前的排名数加一。简单来说rank函数就是对查询出来的记录进行排名,与row_number函数不同的是,rank函数考虑到了over子句中排序字段值相同的情况,如果使用rank函数来生成序号,over子句中排序字段值相同的序号是一样的,后面字段值不相同的序号将跳过相同的排名号排下一个,也就是相关行之前的排名数加一,可以理解为根据当前的记录数生成序号,后面的记录依此类推。

    dense_rank函数的功能与rank函数类似,dense_rank函数在生成序号时是连续的,而rank函数生成的序号有可能不连续。dense_rank函数出现相同排名时,将不跳过相同排名号,rank值紧接上一次的rank值。在各个分组内,rank()是跳跃排序,有两个第一名时接下来就是第三名,dense_rank()是连续排序,有两个第一名时仍然跟着第二名。*/

    SELECT 
    	DEPARTMENT_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, SALARY,
    	RANK() OVER (ORDER BY SALARY) AS RANK_ORDER,--按照工资进行排序,标记排名,重复值则标记为一样,后面的跳跃标记
    	DENSE_RANK() OVER (ORDER BY SALARY) AS DENSE_RANK_ORDER,--按照工资进行排序,标记排名,重复值则标记为一样,后面的挨着标记
    	ROW_NUMBER() OVER (ORDER BY SALARY) AS ROW_NUMBER_ORDER--按照工资进行排序,标记排名,连续排名且不重复
    FROM EMPLOYEES;
    
    
    SELECT 
    	DEPARTMENT_ID, FIRST_NAME||' '||LAST_NAME EMPLOYEE_NAME, SALARY,
    	RANK() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS RANK_PART_ORDER,--按照部门ID分组,然后按照工资进行排序,标记排名,重复值则标记为一样,后面的跳跃标记
    	DENSE_RANK() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS DENSE_RANK_PART_ORDER,--按照部门ID分组,然后按照工资进行排序,标记排名,重复值则标记为一样,后面的挨着标记
    	ROW_NUMBER() OVER (PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS ROW_NUMBER_PART_ORDER--按照部门ID分组,然后按照工资进行排序,标记排名,连续排名且不重复
    FROM EMPLOYEES;

    /*lag(exp_str,offset,defval) over()
    exp_str 指的是要做对比的字段。
    offset 是 exp_str 字段的偏移量,即 offset 为N ,指的是在表中从当前行位置向前数N行就是我们所要找的那一行了。
    比如说,
    在表中,假设当前我们说的当前行在表中排在第四行,则 offset 为3时表示的是我们所要找的数据行就是表中的第一行(即4-3=1)。
    offset 的默认值为1
    lag()函数的返回值为在表中从当前行位置向前数N行的那一行上 exp_str 字段的值。
    当在表中从当前行位置向前数N行已经超出了表的范围时,lag()函数将 defval 这个参数值作为函数的返回值。
    比如说,
    在表中,假设当前我们说的当前行在表中排在第四行,则 offset 为6时表示的是我们所要找的数据行就是表中的第-2行(即4-6=-2),这就表示我们所要找的数据行不在表中已经超出表的范围了,所以lag()函数将 defval 这个参数值作为函数的返回值。
    default 参数的默认值为空值 null,即如果在lag()函数中没有显式设置 default 参数值时 lag() 函数的返回值为空值 null。
    Lead函数的用法类似。*/

    SELECT ENAME,JOB,SAL ,LAG(SAL) OVER(ORDER BY SAL) LAST_SAL FROM EMP;
    
    SELECT ENAME,JOB,SAL ,LAG(SAL,1,500) OVER(ORDER BY SAL) LAST_SAL FROM EMP;
    
    SELECT ENAME,JOB,SAL ,LAG(SAL,2) OVER(ORDER BY SAL) LAST_SAL FROM EMP;
    
    SELECT ENAME,JOB,SAL ,LEAD(SAL) OVER(ORDER BY SAL) LAST_SAL FROM EMP;
    
    SELECT ENAME,JOB,SAL ,LEAD(SAL,1) OVER(ORDER BY SAL) LAST_SAL FROM EMP;
    
    SELECT ENAME,JOB,SAL ,LEAD(SAL,2) OVER(ORDER BY SAL) LAST_SAL FROM EMP;
    
    SELECT ENAME,JOB,SAL ,LEAD(SAL,1) OVER(PARTITION BY JOB ORDER BY SAL) LAST_SAL FROM EMP;
    
    SELECT ENAME,JOB,SAL ,LAG(SAL,1) OVER(PARTITION BY JOB ORDER BY SAL) LAST_SAL FROM EMP;

     

    --查询各部门工资最高的2名员工信息
    SELECT * FROM (SELECT DEPTNO,ENAME,SAL,ROW_NUMBER() OVER (PARTITION BY DEPTNO ORDER BY SAL DESC) RN FROM EMP) WHERE RN<3; 

    --查询全公司工资最高的第6-10名员工
    select * from (SELECT ENAME,SAL,ROW_NUMBER() OVER (ORDER BY SAL DESC) RN FROM EMP) where  RN>=6 and RN<=10;

    --查询大于本部门平均工资的员工信息
    select a.DEPTNO,a.ENAME,a.SAL from EMP a,(select DEPTNO,avg(SAL) as SAL from EMP group by DEPTNO) b where a.DEPTNO=b.DEPTNO and a.SAL>b.SAL;

     

    --对排序的理解
    --sql无排序,over()排序子句省略
    SELECT 
        DEPTNO,EMPNO,ENAME,SAL, 
        LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO)
    FROM EMP;

    --sql无排序,over()排序子句有,窗口省略
    SELECT 
        DEPTNO,EMPNO,ENAME,SAL,
        LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL DESC)
    FROM EMP;

    --sql无排序,over()排序子句有,窗口也有,窗口特意强调全组数据
    SELECT 
        DEPTNO,EMPNO,ENAME,SAL,
        LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) MAX_SAL
    FROM EMP;

    --sql有排序(正序),over()排序子句无,先做sql排序再进行分析函数运算
    SELECT 
        DEPTNO,MGR,ENAME,SAL,HIREDATE,
        LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO) LAST_VALUE
    FROM EMP ORDER BY DEPTNO, SAL;

    --sql有排序(倒序),over()排序子句无,先做sql排序再进行分析函数运算
    SELECT 
        DEPTNO,MGR,ENAME,SAL,HIREDATE,
        LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO) LAST_VALUE
    FROM EMP ORDER BY DEPTNO, SAL DESC;

    --sql有排序(倒序),over()排序子句有,窗口子句无,此时的运算是:sql先选数据但是不排序,而后排序子句先排序并进行分析函数处理(窗口默认为第一行到当前行),最后再进行sql排序
    SELECT 
        DEPTNO,MGR,ENAME,SAL,HIREDATE,
        LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL ASC) LAST_VALUE
    FROM EMP ORDER BY DEPTNO,SAL DESC;

    SELECT 
        DEPTNO,MGR,ENAME,SAL,HIREDATE,
        LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL DESC ) LAST_VALUE
    FROM EMP ORDER BY DEPTNO,SAL DESC;

     

     

    --以下转载暂无数据源

     

    --count() over()  :统计分区中各组的行数,partition by 可选,order by 可选

    SELECT ENAME,ESEX,EAGE,COUNT(*) OVER() FROM EMP; --总计数
    SELECT ENAME,ESEX,EAGE,COUNT(*) OVER(ORDER BY EAGE) FROM EMP; --递加计数
    SELECT ENAME,ESEX,EAGE,COUNT(*) OVER(PARTITION BY ESEX) FROM EMP; --分组计数
    SELECT ENAME,ESEX,EAGE,COUNT(*) OVER(PARTITION BY ESEX ORDER BY EAGE) FROM EMP;--分组递加计数

    --sum() over()  :统计分区中记录的总和,partition by 可选,order by 可选

    select ename,esex,eage,sum(salary) over() from emp; --总累计求和
    select ename,esex,eage,sum(salary) over(order by eage) from emp; --递加累计求和
    select ename,esex,eage,sum(salary) over(partition by esex) from emp; --分组累计求和
    select ename,esex,eage,sum(salary) over(partition by esex order by eage) from emp; --分组递加累计求和

    --avg() over()  :统计分区中记录的平均值,partition by 可选,order by 可选

    select ename,esex,eage,avg(salary) over() from emp; --总平均值
    select ename,esex,eage,avg(salary) over(order by eage) from emp; --递加求平均值
    select ename,esex,eage,avg(salary) over(partition by esex) from emp; --分组求平均值
    select ename,esex,eage,avg(salary) over(partition by esex order by eage) from emp; --分组递加求平均值

    --min() over() :统计分区中记录的最小值,partition by 可选,order by 可选
    --max() over() :统计分区中记录的最大值,partition by 可选,order by 可选

    select ename,esex,eage,salary,min(salary) over() from emp; --求总最小值
    select ename,esex,eage,salary,min(salary) over(order by eage) from emp; --递加求最小值
    select ename,esex,eage,salary,min(salary) over(partition by esex) from emp; --分组求最小值
    select ename,esex,eage,salary,min(salary) over(partition by esex order by eage) from emp; --分组递加求最小值
    select ename,esex,eage,salary,max(salary) over() from emp; --求总最大值
    select ename,esex,eage,salary,max(salary) over(order by eage) from emp; --递加求最大值
    select ename,esex,eage,salary,max(salary) over(partition by esex) from emp; --分组求最大值
    select ename,esex,eage,salary,max(salary) over(partition by esex order by eage) from emp; --分组递加求最大值

    --rank() over()  :跳跃排序,partition by 可选,order by 必选

    select ename,eage,rank() over(partition by job order by eage) from emp;
    select ename,eage,rank() over(order by eage) from emp;

    --dense_rank() :连续排序,partition by 可选,order by 必选

    select ename,eage,dense_rank() over(partition by job order by eage) from emp;
    select ename,eage,dense_rank() over(order by eage) from emp;

    --row_number() over() :排序,无重复值,partition by 可选,order by 必选

    select ename,eage,row_number() over(partition by job order by eage) from emp;
    select ename,eage,row_number() over(order by eage) from emp;

    --ntile(n) over() :partition by 可选,order by 必选
    --n表示将分区内记录平均分成n份,多出的按照顺序依次分给前面的组

    select ename,salary,ntile(3) over(order by salary desc) from emp;
    select ename,salary,ntile(3) over(partition by job order by salary desc) from emp;

    --first_value() over() :取出分区中第一条记录的字段值,partition by 可选,order by 可选
    --last_value() over() :取出分区中最后一条记录的字段值,partition by 可选,order by 可选

    select ename,first_value(salary) over() from emp;
    select ename,first_value(salary) over(order by salary desc) from emp;
    select ename,first_value(salary) over(partition by job) from emp;                                                           
    select ename,first_value(salary) over(partition by job order by salary desc) from emp;
    
    select ename,last_value(ename) over() from emp;
    select ename,last_value(ename) over(order by salary desc) from emp;
    select ename,last_value(ename) over(partition by job) from emp;
    select ename,last_value(ename) over(partition by job order by salary desc) from emp;

    --first :从DENSE_RANK返回的集合中取出排在最前面的一个值的行
    --last :从DENSE_RANK返回的集合中取出排在最后面的一个值的行

    select 
    	job,max(salary) keep(dense_rank first order by salary desc),
    	max(salary) keep(dense_rank last order by salary desc) 
    from emp
    group by job;

    --lag() over() :取出前n行数据,partition by 可选,order by 必选
    --lead() over() :取出后n行数据,partition by 可选,order by 必选

    select 
    	ename,eage,lag(eage,1,0) over(order by salary), 
    	lead(eage,1,0) over(order by salary) 
    from emp;
     
    select 
    	ename,eage,lag(eage,1) over(partition by esex order by salary),
    	lead(eage,1) over(partition by esex order by salary) 
    from emp;

    --ratio_to_report(a) over(partition by b) :求按照b分组后a的值在所属分组中总值的占比,a的值必须为数值或数值型字段。partition by 可选,order by 不可选

    select ename,job,salary,ratio_to_report(1) over() from emp; --给每一行赋值1,求当前行在总值的占比,总是0.1
    select ename,job,salary,ratio_to_report(salary) over() from emp; --当前行的值在所有数据中的占比
    select ename,job,salary,ratio_to_report(1) over(partition by job) from emp; --给每一行赋值1,求当前行在分组后的组内总值的占比
    select ename,job,salary,ratio_to_report(salary) over(partition by job) from emp; --当前行的值在分组后组内总值占比

    --percent_rank() over()  :partition by 可选,order by 必选
    --所在组排名序号-1除以该组所有的行数-1,排名跳跃排序

    select ename,job,salary,percent_rank() over(order by salary) from emp;
    select ename,job,salary,percent_rank() over(partition by job order by salary) from emp;

    --cume_dist() over() :partition by 可选,order by必选
    --所在组排名序号除以该组所有的行数,注意对于重复行,计算时取重复行中的最后一行的位置

    select ename,job,salary,cume_dist() over(order by salary) from emp;
    select ename,job,salary,cume_dist() over(partition by job order by salary) from emp;

    /*precentile_cont( x ) within group(order by ...) over()    :over()中partition by可选,order by 不可选
    x为输入的百分比,是0-1之间的一个小数,返回该百分比位置的数据,若没有则返回以下计算值(r):
    a=1+( x *(N-1) )  x为输入的百分比,N为分区内的记录的行数
    b=ceil ( a )  向上取整
    c = floor( a ) 向下取整
    r=a * 百分比位置上一条数据 + b * 百分比位置下一条数据*/

    select ename,job,salary,percentile_cont(0.5) within group(order by salary) over() from emp;
    select ename,job,salary,percentile_cont(0.5) within group(order by salary) over(partition by job) from emp;

    --precentile_disc( x ) within group(order by ...) over()   :over()中partition by可选,order by 不可选
    --x为输入的百分比,是0-1之间的一个小数,返回百分比位置对应位置上的数据值,若没有对应数据值,就取大于该分布值的下一个值

    select ename,job,salary,percentile_disc(0.5) within group(order by salary) over()from emp;
    select ename,job,salary,percentile_disc(0.5) within group(order by salary) over(partition by job) from emp;

    /*stddev() over():计算样本标准差,只有一行数据时返回0,partition by 可选,order by 可选
    stddev_samp() over():计算样本标准差,只有一行数据时返回null,partition by 可选,order by 可选
    stddev_pop() over():计算总体标准差,partition by 可选,order by 可选*/

    select stddev(stu_age) over() from student; --计算所有记录的样本标准差
    select stddev(stu_age) over(order by stu_age) from student; --计算递加的样本标准差
    select stddev(stu_age) over(partition by stu_major) from student; --计算分组的样本标准差
    select stddev(stu_age) over(partition by stu_major order by stu_age) from student; --计算分组递加的样本标准差
    select stddev_samp(stu_age) over() from student; --计算所有记录的样本标准差
    select stddev_samp(stu_age) over(order by stu_age) from student; --计算递加的样本标准差
    select stddev_samp(stu_age) over(partition by stu_major) from student; --计算分组的样本标准差
    select stddev_samp(stu_age) over(partition by stu_major order by stu_age) from student; --计算分组递加的样本标准差
    select stddev_pop(stu_age) over() from student; --计算所有记录的总体标准差
    select stddev_pop(stu_age) over(order by stu_age) from student; --计算递加的总体标准差
    select stddev_pop(stu_age) over(partition by stu_major) from student; --计算分组的总体标准差
    select stddev_pop(stu_age) over(partition by stu_major order by stu_age) from student;--计算分组递加的总体标准差

    /*variance() over():计算样本方差,只有一行数据时返回0,partition by 可选,order by 可选
    var_samp() over():计算样本方差,只有一行数据时返回null,partition by 可选,order by 可选
    var_pop() over():计算总体方差,partition by 可选,order by 可选*/

    select variance(stu_age) over() from student; --计算所有记录的样本方差
    select variance(stu_age) over(order by stu_age) from student; --计算递加的样本方差
    select variance(stu_age) over(partition by stu_major) from student; --计算分组的样本方差
    select variance(stu_age) over(partition by stu_major order by stu_age) from student; --计算分组递加的样本方差
    select var_samp(stu_age) over() from student; --计算所有记录的样本方差
    select var_samp(stu_age) over(order by stu_age) from student; --计算递加的样本方差
    select var_samp(stu_age) over(partition by stu_major) from student; --计算分组的样本方差
    select var_samp(stu_age) over(partition by stu_major order by stu_age) from student; --计算分组递加的样本方差
    select var_pop(stu_age) over() from student; --记录所有就的总体方差
    select var_pop(stu_age) over(order by stu_age) from student; --计算递加的总体方差
    select var_pop(stu_age) over(partition by stu_major) from student; --计算分组的总体方差
    select var_pop(stu_age) over(partition by stu_major order by stu_age) from student;--计算分组递加的样本方差

    /*
    stddev()=sqrt( variance() )     sqrt()--求开方
    stddev_samp()=sqrt( var_samp() )
    stddec_pop=sqrt( var_pop() )
    */

    --covar_samp over():返回一对表达式的样本协方差,partition by 可选,order by 可选
    --covar_pop over(): 返回一堆表达式的总体协方差,partition by 可选,order by 可选

    select covar_samp(stu_age,line) over() from student; --计算所有记录的样本协方差
    select covar_samp(stu_age,line) over(order by stu_age) from student; --计算递加的样本协方差
    select covar_samp(stu_age,line) over(partition by stu_major) from student; --计算分组的样本协方差
    select covar_samp(stu_age,line) over(partition by stu_major order by stu_age) from student; --计算分组递加的样本协方差
    select covar_pop(stu_age,line) over() from student; --计算所有记录的总体协方差
    select covar_pop(stu_age,line) over(order by stu_age) from student; --计算递加的总体协方差
    select covar_pop(stu_age,line) over(partition by stu_major) from student; --计算分组的总体协方差
    select covar_pop(stu_age,line) over(partition by stu_major order by stu_age) from student; --计算分组递加的总体协方差

    --corr() over() :返回一对表达式的相关系数,partition by 可选,order by 可选

    select corr(stu_age,line) over() from student; --计算所有记录的相关系数
    select corr(stu_age,line) over(order by stu_age) from student; --计算递加的相关系数
    select corr(stu_age,line) over(partition by stu_major) from student; --计算分组的相关系数
    select corr(stu_age,line) over(partition by stu_major order by stu_age) from student; --计算分组递加的相关系数

     

    --实际案例

    --创建模拟表

    create table T( 
       BILL_MONTH varchar2(12) , 
       AREA_CODE number, 
       NET_TYPE varchar(2), 
       LOCAL_FARE number 
    );
    
    insert into t values('200405',5761,'G', 7393344.04); 
    insert into t values('200405',5761,'J', 5667089.85); 
    insert into t values('200405',5762,'G', 6315075.96); 
    insert into t values('200405',5762,'J', 6328716.15); 
    insert into t values('200405',5763,'G', 8861742.59); 
    insert into t values('200405',5763,'J', 7788036.32); 
    insert into t values('200405',5764,'G', 6028670.45); 
    insert into t values('200405',5764,'J', 6459121.49); 
    insert into t values('200405',5765,'G', 13156065.77); 
    insert into t values('200405',5765,'J', 11901671.70); 
    insert into t values('200406',5761,'G', 7614587.96); 
    insert into t values('200406',5761,'J', 5704343.05); 
    insert into t values('200406',5762,'G', 6556992.60); 
    insert into t values('200406',5762,'J', 6238068.05); 
    insert into t values('200406',5763,'G', 9130055.46); 
    insert into t values('200406',5763,'J', 7990460.25); 
    insert into t values('200406',5764,'G', 6387706.01); 
    insert into t values('200406',5764,'J', 6907481.66); 
    insert into t values('200406',5765,'G', 13562968.81); 
    insert into t values('200406',5765,'J', 12495492.50); 
    insert into t values('200407',5761,'G', 7987050.65); 
    insert into t values('200407',5761,'J', 5723215.28); 
    insert into t values('200407',5762,'G', 6833096.68); 
    insert into t values('200407',5762,'J', 6391201.44); 
    insert into t values('200407',5763,'G', 9410815.91); 
    insert into t values('200407',5763,'J', 8076677.41); 
    insert into t values('200407',5764,'G', 6456433.23); 
    insert into t values('200407',5764,'J', 6987660.53); 
    insert into t values('200407',5765,'G', 14000101.20); 
    insert into t values('200407',5765,'J', 12301780.20); 
    insert into t values('200408',5761,'G', 8085170.84); 
    insert into t values('200408',5761,'J', 6050611.37); 
    insert into t values('200408',5762,'G', 6854584.22); 
    insert into t values('200408',5762,'J', 6521884.50); 
    insert into t values('200408',5763,'G', 9468707.65); 
    insert into t values('200408',5763,'J', 8460049.43); 
    insert into t values('200408',5764,'G', 6587559.23); 
    insert into t values('200408',5764,'J', 7342135.86); 
    insert into t values('200408',5765,'G', 14450586.63); 
    insert into t values('200408',5765,'J', 12680052.38); 
    commit;

    --取出每月通话费最高和最低的两个地区

    SELECT 
    	BILL_MONTH,AREA_CODE,SUM(LOCAL_FARE) LOCAL_FARE, 
        FIRST_VALUE(AREA_CODE) OVER(PARTITION BY BILL_MONTH ORDER BY SUM(LOCAL_FARE) DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) FIRSTVAL, 
        LAST_VALUE(AREA_CODE) OVER(PARTITION BY BILL_MONTH ORDER BY SUM(LOCAL_FARE) DESC ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) LASTVAL 
    FROM T GROUP BY BILL_MONTH, AREA_CODE ORDER BY BILL_MONTH;

    --计算出各个地区连续3个月的通话费用的平均数(移动平均值)

    SELECT 
    	AREA_CODE,BILL_MONTH,LOCAL_FARE,
        SUM(LOCAL_FARE) OVER(PARTITION BY AREA_CODE ORDER BY TO_NUMBER(BILL_MONTH) RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) "3month_sum", 
        AVG(LOCAL_FARE) OVER(PARTITION BY AREA_CODE ORDER BY TO_NUMBER(BILL_MONTH) RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) "3month_avg", 
        MAX(LOCAL_FARE) OVER(PARTITION BY AREA_CODE ORDER BY TO_NUMBER(BILL_MONTH) RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) "3month_max", 
        MIN(LOCAL_FARE) OVER(PARTITION BY AREA_CODE ORDER BY TO_NUMBER(BILL_MONTH) RANGE BETWEEN 1 PRECEDING AND 1 FOLLOWING) "3month_min" 
     FROM (
    	SELECT T.AREA_CODE, T.BILL_MONTH, SUM(T.LOCAL_FARE) LOCAL_FARE FROM T GROUP BY T.AREA_CODE, T.BILL_MONTH);

    --求各地区按月份累加的通话费

    SELECT 
    	AREA_CODE,BILL_MONTH,LOCAL_FARE,
        SUM(LOCAL_FARE) OVER(PARTITION BY AREA_CODE ORDER BY BILL_MONTH ASC) "LAST_SUM_VALUE" 
    FROM (
    	SELECT T.AREA_CODE, T.BILL_MONTH, SUM(T.LOCAL_FARE) LOCAL_FARE FROM T GROUP BY T.AREA_CODE, T.BILL_MONTH) 
    ORDER BY AREA_CODE, BILL_MONTH;

     

    展开全文
  • Oracle函数很多,在这里整理一下,方便使用。 Oracle数值型函数 Oracle字符型函数 Oracle日期函数 Oracle转换函数 Oracle聚组函数 Oracle其他函数 分析函数oracle分析函数--SQL*PLUS环境 一、总体...

    Oracle的函数很多,在这里整理一下,方便使用。

    Oracle数值型函数

    Oracle字符型函数

    Oracle日期函数

    Oracle转换函数

    Oracle聚组函数

    Oracle其他函数


    分析函数:


    oracle分析函数--SQL*PLUS环境


    一、总体介绍
    1.1 分析函数如何工作
    语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC DESC> <NULLS FIRST NULLS LAST>> <WINDOWING子句>) PARTITION子句 ORDER BY子句 WINDOWING子句 缺省时相当于RANGE UNBOUNDED PRECEDING
    1. 值域窗(RANGE WINDOW)
    RANGE N PRECEDING 仅对数值或日期类型有效,选定窗为排序后当前行之前,某列(即排序列)值大于/小于(当前行该列值 –/+ N)的所有行,因此与ORDER BY子句有关系。
    2. 行窗(ROW WINDOW)
    ROWS N PRECEDING 选定窗为当前行及之前N行。
    还可以加上BETWEEN AND 形式,例如RANGE BETWEEN m PRECEDING AND n FOLLOWING
    函数 AVG(<distinct all> eXPr)
    一组或选定窗中表达式的平均值 CORR(expr, expr) 即COVAR_POP(exp1,exp2) / (STDDEV_POP(expr1) * STDDEV_POP(expr2)),两个表达式的互相关,-1(反相关) ~ 1(正相关),0表示不相关
    COUNT(<distinct> <*> <expr>) 计数
    COVAR_POP(expr, expr) 总体协方差
    COVAR_SAMP(expr, expr) 样本协方差
    CUME_DIST 累积分布,即行在组中的相对位置,返回0 ~ 1
    DENSE_RANK 行的相对排序(与ORDER BY搭配),相同的值具有一样的序数(NULL计为相同),并不留空序数
    FIRST_VALUE 一个组的第一个值
    LAG(expr, <offset>, <default>) 访问之前的行,OFFSET是缺省为1 的正数,表示相对行数,DEFAULT是当超出选定窗范围时的返回值(如第一行不存在之前行)
    LAST_VALUE 一个组的最后一个值
    LEAD(expr, <offset>, <default>) 访问之后的行,OFFSET是缺省为1 的正数,表示相对行数,DEFAULT是当超出选定窗范围时的返回值(如最后行不存在之前行)
    MAX(expr) 最大值
    MIN(expr) 最小值
    NTILE(expr) 按表达式的值和行在组中的位置编号,如表达式为4,则组分4份,分别为1 ~ 4的值,而不能等分则多出的部分在值最小的那组
    PERCENT_RANK 类似CUME_DIST,1/(行的序数 - 1)
    RANK 相对序数,答应并列,并空出随后序号
    RATIO_TO_REPORT(expr) 表达式值 / SUM(表达式值)
    ROW_NUMBER 排序的组中行的偏移
    STDDEV(expr) 标准差
    STDDEV_POP(expr) 总体标准差
    STDDEV_SAMP(expr) 样本标准差
    SUM(expr) 合计
    VAR_POP(expr) 总体方差
    VAR_SAMP(expr) 样本方差
    VARIANCE(expr) 方差
    REGR_ xxxx(expr, expr) 线性回归函数
    REGR_SLOPE:返回斜率,等于COVAR_POP(expr1, expr2) / VAR_POP(expr2)
    REGR_INTERCEPT:返回回归线的y截距,等于
    AVG(expr1) - REGR_SLOPE(expr1, expr2) * AVG(expr2)
    REGR_COUNT:返回用于填充回归线的非空数字对的数目
    REGR_R2:返回回归线的决定系数,计算式为:
    If VAR_POP(expr2) = 0 then return NULL
    If VAR_POP(expr1) = 0 and VAR_POP(expr2) != 0 then return 1
    If VAR_POP(expr1) > 0 and VAR_POP(expr2 != 0 then
    return POWER(CORR(expr1,expr),2)
    REGR_AVGX:计算回归线的自变量(expr2)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr2)
    REGR_AVGY:计算回归线的应变量(expr1)的平均值,去掉了空对(expr1, expr2)后,等于AVG(expr1)
    REGR_SXX: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr2)
    REGR_SYY: 返回值等于REGR_COUNT(expr1, expr2) * VAR_POP(expr1)
    REGR_SXY: 返回值等于REGR_COUNT(expr1, expr2) * COVAR_POP(expr1, expr2)

    首先:创建表及接入测试数据
    create table students
    (id number(15,0),
    area varchar2(10),
    stu_type varchar2(2),
    score number(20,2));
    insert into students values(1, '111', 'g', 80 );
    insert into students values(1, '111', 'j', 80 );
    insert into students values(1, '222', 'g', 89 );
    insert into students values(1, '222', 'g', 68 );
    insert into students values(2, '111', 'g', 80 );
    insert into students values(2, '111', 'j', 70 );
    insert into students values(2, '222', 'g', 60 );
    insert into students values(2, '222', 'j', 65 );
    insert into students values(3, '111', 'g', 75 );
    insert into students values(3, '111', 'j', 58 );
    insert into students values(3, '222', 'g', 58 );
    insert into students values(3, '222', 'j', 90 );
    insert into students values(4, '111', 'g', 89 );
    insert into students values(4, '111', 'j', 90 );
    insert into students values(4, '222', 'g', 90 );
    insert into students values(4, '222', 'j', 89 );
    commit;


    二、具体应用:
    1、分组求和:
    1)GROUP BY子句
    --A、GROUPING SETS

    select id,area,stu_type,sum(score) score
    from students
    group by grouping sets((id,area,stu_type),(id,area),id)
    order by id,area,stu_type;

    /*--------理解grouping sets
    select a, b, c, sum( d ) from t
    group by grouping sets ( a, b, c )

    等效于

    select * from (
    select a, null, null, sum( d ) from t group by a
    union all
    select null, b, null, sum( d ) from t group by b
    union all
    select null, null, c, sum( d ) from t group by c
    )
    */

    --B、ROLLUP

    select id,area,stu_type,sum(score) score
    from students
    group by rollup(id,area,stu_type)
    order by id,area,stu_type;

    /*--------理解rollup
    select a, b, c, sum( d )
    from t
    group by rollup(a, b, c);

    等效于

    select * from (
    select a, b, c, sum( d ) from t group by a, b, c
    union all
    select a, b, null, sum( d ) from t group by a, b
    union all
    select a, null, null, sum( d ) from t group by a
    union all
    select null, null, null, sum( d ) from t
    )
    */

    --C、CUBE

    select id,area,stu_type,sum(score) score
    from students
    group by cube(id,area,stu_type)
    order by id,area,stu_type;

    /*--------理解cube
    select a, b, c, sum( d ) from t
    group by cube( a, b, c)

    等效于

    select a, b, c, sum( d ) from t
    group by grouping sets(
    ( a, b, c ),
    ( a, b ), ( a ), ( b, c ),
    ( b ), ( a, c ), ( c ),
    () )
    */

    --D、GROUPING
    /*从上面的结果中我们很容易发现,每个统计数据所对应的行都会出现null,
    如何来区分到底是根据那个字段做的汇总呢,grouping函数判断是否合计列!*/

    select decode(grouping(id),1,'all id',id) id,
    decode(grouping(area),1,'all area',to_char(area)) area,
    decode(grouping(stu_type),1,'all_stu_type',stu_type) stu_type,
    sum(score) score
    from students
    group by cube(id,area,stu_type)
    order by id,area,stu_type; 


    二、OVER()函数的使用
    1、统计名次——DENSE_RANK(),ROW_NUMBER()
    1)允许并列名次、名次不间断,DENSE_RANK(),结果如122344456……
    将score按ID分组排名:dense_rank() over(partition by id order by score desc)
    将score不分组排名:dense_rank() over(order by score desc)
    select id,area,score,
    dense_rank() over(partition by id order by score desc) 分组id排序,
    dense_rank() over(order by score desc) 不分组排序
    from students order by id,area;

    2)不允许并列名次、相同值名次不重复,ROW_NUMBER(),结果如123456……
    将score按ID分组排名:row_number() over(partition by id order by score desc)
    将score不分组排名:row_number() over(order by score desc)
    select id,area,score,
    row_number() over(partition by id order by score desc) 分组id排序,
    row_number() over(order by score desc) 不分组排序
    from students order by id,area;

    3)允许并列名次、复制名次自动空缺,rank(),结果如12245558……
    将score按ID分组排名:rank() over(partition by id order by score desc)
    将score不分组排名:rank() over(order by score desc)
    select id,area,score,
    rank() over(partition by id order by score desc) 分组id排序,
    rank() over(order by score desc) 不分组排序
    from students order by id,area;

    4)名次分析,cume_dist()——-最大排名/总个数
    函数:cume_dist() over(order by id)
    select id,area,score,
    cume_dist() over(order by id) a, --按ID最大排名/总个数
    cume_dist() over(partition by id order by score desc) b, --ID分组中,scroe最大排名值/本组总个数
    row_number() over (order by id) 记录号
    from students order by id,area;

    5)利用cume_dist(),允许并列名次、复制名次自动空缺,取并列后较大名次,结果如22355778……
    将score按ID分组排名:cume_dist() over(partition by id order by score desc)*sum(1) over(partition by id)
    将score不分组排名:cume_dist() over(order by score desc)*sum(1) over()
    select id,area,score,
    sum(1) over() as 总数,
    sum(1) over(partition by id) as 分组个数,
    (cume_dist() over(partition by id order by score desc))*(sum(1) over(partition by id)) 分组id排序,
    (cume_dist() over(order by score desc))*(sum(1) over()) 不分组排序
    from students order by id,area

    2、分组统计--sum(),max(),avg(),RATIO_TO_REPORT()
    select id,area,
    sum(1) over() as 总记录数,
    sum(1) over(partition by id) as 分组记录数,
    sum(score) over() as 总计 ,
    sum(score) over(partition by id) as 分组求和,
    sum(score) over(order by id) as  分组连续求和,
    sum(score) over(partition by id,area) as 分组ID和area求和,
    sum(score) over(partition by id order by area) as 分组ID并连续按area求和,
    max(score) over() as 最大值,
    max(score) over(partition by id) as 分组最大值,
    max(score) over(order by id) as 分组连续最大值,
    max(score) over(partition by id,area) as 分组ID和area求最大值,
    max(score) over(partition by id order by area) as 分组ID并连续按area求最大值,
    avg(score) over() as 所有平均,
    avg(score) over(partition by id) as 分组平均,
    avg(score) over(order by id) as 分组连续平均,
    avg(score) over(partition by id,area) as 分组ID和area平均,
    avg(score) over(partition by id order by area) as 分组ID并连续按area平均,
    RATIO_TO_REPORT(score) over() as "占所有%",
    RATIO_TO_REPORT(score) over(partition by id) as "占分组%",
    score from students;

    3、LAG(COL,n,default)、LEAD(OL,n,default) --取前后边N条数据
    取前面记录的值:lag(score,n,x) over(order by id)
    取后面记录的值:lead(score,n,x) over(order by id)
    参数:n表示移动N条记录,X表示不存在时填充值,iD表示排序列
    select id,lag(score,1,0) over(order by id) lg,score from students;
    select id,lead(score,1,0) over(order by id) lg,score from students;

    4、FIRST_VALUE()、LAST_VALUE()
    取第起始1行值:first_value(score,n) over(order by id)
    取第最后1行值:LAST_value(score,n) over(order by id)
    select id,first_value(score) over(order by id) fv,score from students;
    select id,last_value(score) over(order by id) fv,score from students;

     


    sum(...) over ...
    【功能】连续求和分析函数
    【参数】具体参示例
    【说明】Oracle分析函数

    NC示例:
    select bdcode,sum(1) over(order by bdcode) aa from bd_bdinfo 

    【示例】
    1.原表信息: SQL> break on deptno skip 1  -- 为效果更明显,把不同部门的数据隔段显示。
    SQL> select deptno,ename,sal
       2   from emp
       3   order by deptno;

    DEPTNO ENAME          SAL
    ---------- ---------- ----------
           10 CLARK          2450
              KING          5000
              MILLER           1300

           20 SMITH          800
              ADAMS          1100
              FORD          3000
              SCOTT          3000
              JONES          2975

           30 ALLEN          1600
              BLAKE          2850
              MARTIN           1250
              JAMES          950
              TURNER           1500
              WARD          1250

    2.先来一个简单的,注意over(...)条件的不同,
    使用 sum(sal) over (order by ename)... 查询员工的薪水“连续”求和,
    注意over (order   by ename)如果没有order by 子句,求和就不是“连续”的,
    放在一起,体会一下不同之处:

    SQL> select deptno,ename,sal,
       2   sum(sal) over (order by ename) 连续求和,
       3   sum(sal) over () 总和,                -- 此处sum(sal) over () 等同于sum(sal)
       4   100*round(sal/sum(sal) over (),4) "份额(%)"
       5   from emp
       6   /

    DEPTNO ENAME          SAL 连续求和    总和 份额(%)
    ---------- ---------- ---------- ---------- ---------- ----------
           20 ADAMS          1100    1100    29025    3.79
           30 ALLEN          1600    2700    29025    5.51
           30 BLAKE          2850    5550    29025    9.82
           10 CLARK          2450    8000    29025    8.44
           20 FORD          3000    11000    29025    10.34
           30 JAMES          950    11950    29025    3.27
           20 JONES          2975    14925    29025    10.25
           10 KING          5000    19925    29025    17.23
           30 MARTIN           1250    21175    29025    4.31
           10 MILLER           1300    22475    29025    4.48
           20 SCOTT          3000    25475    29025    10.34
           20 SMITH          800    26275    29025    2.76
           30 TURNER           1500    27775    29025    5.17
           30 WARD          1250    29025    29025    4.31

    3.使用子分区查出各部门薪水连续的总和。注意按部门分区。注意over(...)条件的不同,
    sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和
    sum(sal) over (partition by deptno) 按部门求总和
    sum(sal) over (order by deptno,ename) 不按部门“连续”求总和
    sum(sal) over () 不按部门,求所有员工总和,效果等同于sum(sal)。

    SQL> select deptno,ename,sal,
       2   sum(sal) over (partition by deptno order by ename) 部门连续求和,--各部门的薪水"连续"求和
       3   sum(sal) over (partition by deptno) 部门总和,   -- 部门统计的总和,同一部门总和不变
       4   100*round(sal/sum(sal) over (partition by deptno),4) "部门份额(%)",
       5   sum(sal) over (order by deptno,ename) 连续求和, --所有部门的薪水"连续"求和
       6   sum(sal) over () 总和,   -- 此处sum(sal) over () 等同于sum(sal),所有员工的薪水总和
       7   100*round(sal/sum(sal) over (),4) "总份额(%)"
       8   from emp
       9   /

    DEPTNO ENAME SAL 部门连续求和 部门总和 部门份额(%) 连续求和 总和   总份额(%)
    ------ ------ ----- ------------ ---------- ----------- ---------- ------ ----------
    10 CLARK 2450       2450    8750       28    2450   29025    8.44
       KING 5000       7450    8750    57.14    7450   29025    17.23
       MILLER   1300       8750    8750    14.86    8750   29025    4.48

    20 ADAMS 1100       1100    10875    10.11    9850   29025    3.79
       FORD 3000       4100    10875    27.59    12850   29025    10.34
       JONES 2975       7075    10875    27.36    15825   29025    10.25
       SCOTT 3000        10075    10875    27.59    18825   29025    10.34
       SMITH 800        10875    10875        7.36    19625   29025    2.76

    30 ALLEN 1600       1600    9400    17.02    21225   29025    5.51
       BLAKE 2850       4450    9400    30.32    24075   29025    9.82
       JAMES 950       5400    9400    10.11    25025   29025    3.27
       MARTIN   1250       6650    9400        13.3    26275   29025    4.31
       TURNER   1500       8150    9400    15.96    27775   29025    5.17
       WARD 1250       9400    9400        13.3    29025   29025    4.31

    4.来一个综合的例子,求和规则有按部门分区的,有不分区的例子
    SQL> select deptno,ename,sal,sum(sal) over (partition by deptno order by sal) dept_sum,
       2   sum(sal) over (order by deptno,sal) sum
       3   from emp;

    DEPTNO ENAME          SAL DEPT_SUM        SUM
    ---------- ---------- ---------- ---------- ----------
           10 MILLER           1300    1300    1300
              CLARK          2450    3750    3750
              KING          5000    8750    8750

           20 SMITH          800        800    9550
              ADAMS          1100    1900    10650
              JONES          2975    4875    13625
              SCOTT          3000    10875    19625
              FORD          3000    10875    19625

           30 JAMES          950        950    20575
              WARD          1250    3450    23075
              MARTIN           1250    3450    23075
              TURNER           1500    4950    24575
              ALLEN          1600    6550    26175
              BLAKE          2850    9400    29025

    5.来一个逆序的,即部门从大到小排列,部门里各员工的薪水从高到低排列,累计和的规则不变。

    SQL> select deptno,ename,sal,
       2   sum(sal) over (partition by deptno order by deptno desc,sal desc) dept_sum,
       3   sum(sal) over (order by deptno desc,sal desc) sum
       4   from emp;

    DEPTNO ENAME          SAL DEPT_SUM        SUM
    ---------- ---------- ---------- ---------- ----------
           30 BLAKE          2850    2850    2850
              ALLEN          1600    4450    4450
              TURNER           1500    5950    5950
              WARD          1250    8450    8450
              MARTIN           1250    8450    8450
              JAMES          950    9400    9400

           20 SCOTT          3000    6000    15400
              FORD          3000    6000    15400
              JONES          2975    8975    18375
              ADAMS          1100    10075    19475
              SMITH          800    10875    20275

           10 KING          5000    5000    25275
              CLARK          2450    7450    27725
              MILLER           1300    8750    29025

    6.体会:在"... from emp;"后面不要加order   by 子句,使用的分析函数的(partition by deptno order by sal)
    里已经有排序的语句了,如果再在句尾添加排序子句,一致倒罢了,不一致,结果就令人费劲了。如:

    SQL> select deptno,ename,sal,sum(sal) over (partition by deptno order by sal) dept_sum,
       2   sum(sal) over (order by deptno,sal) sum
       3   from emp
       4   order by deptno desc;

    DEPTNO ENAME          SAL DEPT_SUM        SUM
    ---------- ---------- ---------- ---------- ----------
           30 JAMES          950        950    20575
              WARD          1250    3450    23075
              MARTIN           1250    3450    23075
              TURNER           1500    4950    24575
              ALLEN          1600    6550    26175
              BLAKE          2850    9400    29025

           20 SMITH          800        800    9550
              ADAMS          1100    1900    10650
              JONES          2975    4875    13625
              SCOTT          3000    10875    19625
              FORD          3000    10875    19625

           10 MILLER           1300    1300    1300
              CLARK          2450    3750    3750
              KING          5000    8750    8750


    RANK()
    dense_rank()
    【语法】RANK ( ) OVER ( [query_partition_clause] order_by_clause )
    dense_RANK ( ) OVER ( [query_partition_clause] order_by_clause )

    【功能】聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。
    【参数】dense_rank与rank()用法相当,
    【区别】dence_rank在并列关系是,相关等级不会跳过。rank则跳过
    rank()是跳跃排序,有两个第二名时接下来就是第四名(同样是在各个分组内)
    dense_rank()l是连续排序,有两个第二名时仍然跟着第三名。
    【说明】Oracle分析函数

    【示例】
    聚合函数RANK 和 dense_rank 主要的功能是计算一组数值中的排序值。

      在9i版本之前,只有分析功能(analytic ),即从一个查询结果中计算每一行的排序值,是基于order_by_clause子句中的value_exprs指定字段的。

      其语法为:

      RANK ( ) OVER ( [query_partition_clause] order_by_clause )

      在9i版本新增加了合计功能(aggregate),即对给定的参数值在设定的排序查询中计算出其排序值。这些参数必须是常数或常值表达式,且必须和ORDER BY子句中的字段个数、位置、类型完全一致。

      其语法为:

      RANK ( expr [, expr]... ) WITHIN GROUP
      ( ORDER BY
      expr [ DESC | ASC ] [NULLS { FIRST | LAST }]
      [, expr [ DESC | ASC ] [NULLS { FIRST | LAST }]]...
      )

      例子1:

      有表Table内容如下

      COL1 COL2
        1 1
        2 1
        3 2
        3 1
        4 1
        4 2
        5 2
        5 2
        6 2

      分析功能:列出Col2分组后根据Col1排序,并生成数字列。比较实用于在成绩表中查出各科前几名的信息。

      SELECT a.*,RANK() OVER(PARTITION BY col2 ORDER BY col1) "Rank" FROM table a;

      结果如下:

      COL1 COL2 Rank
        1 1   1
        2 1   2
        3 1   3
        4 1   4
        3 2   1
        4 2   2
        5 2   3
        5 2   3
        6 2   5

      例子2:

      TABLE:A (科目,分数)

      数学,80
      语文,70
      数学,90
      数学,60
      数学,100
      语文,88
      语文,65
      语文,77

      现在我想要的结果是:(即想要每门科目的前3名的分数)
        数学,100
      数学,90
      数学,80
      语文,88
      语文,77
      语文,70

      那么语句就这么写:

      select * from (select rank() over(partition by 科目 order by 分数 desc) rk,a.* from a) t
      where t.rk<=3;

      例子3:

      合计功能:计算出数值(4,1)在Orade By Col1,Col2排序下的排序值,也就是col1=4,col2=1在排序以后的位置

      SELECT RANK(4,3) WITHIN GROUP (ORDER BY col1,col2) "Rank" FROM table;

      结果如下:
      Rank
      4

      dense_rank与rank()用法相当,但是有一个区别:dence_rank在并列关系是,相关等级不会跳过。rank则跳过

      例如:表

      A      B      C
      a     liu     wang
      a     jin     shu
      a     cai     kai
      b     yang     du
      b     lin     ying
      b     yao     cai
      b     yang     99

      例如:当rank时为:

      select m.a,m.b,m.c,rank() over(partition by a order by b) liu from test3 m

       A     B       C     LIU
       a     cai      kai     1
       a     jin      shu     2
       a     liu      wang     3
       b     lin      ying     1
       b     yang     du      2
       b     yang     99      2
       b     yao      cai     4

      而如果用dense_rank时为:

      select m.a,m.b,m.c,dense_rank() over(partition by a order by b) liu from test3 m

       A     B       C     LIU
       a     cai     kai     1
       a     jin     shu     2
       a     liu     wang     3
       b     lin     ying     1
       b     yang     du      2
       b     yang     99      2
       b     yao     cai     3 


    ROW_NUMBER()
    【语法】ROW_NUMBER() OVER (PARTITION BY COL1 ORDER BY COL2)
    【功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)
    row_number() 返回的主要是“行”的信息,并没有排名
    【参数】
    【说明】Oracle分析函数

    主要功能:用于取前几名,或者最后几名等

    【示例】
    表内容如下:
    name | seqno | description
    A | 1 | test
    A | 2 | test
    A | 3 | test
    A | 4 | test
    B | 1 | test
    B | 2 | test
    B | 3 | test
    B | 4 | test
    C | 1 | test
    C | 2 | test
    C | 3 | test
    C | 4 | test

    我想有一个sql语句,搜索的结果是
    A | 1 | test
    A | 2 | test
    B | 1 | test
    B | 2 | test
    C | 1 | test
    C | 2 | test
    实现:
    select name,seqno,description
    from(select name,seqno,description,row_number() over (partition by name order by seqno) id
    from table_name) where id<=3;


    lag()和lead()
    【语法】
    lag(EXPR,<OFFSET>,<DEFAULT>)
    LEAD(EXPR,<OFFSET>,<DEFAULT>)
    【功能】表示根据COL1分组,在分组内部根据 COL2排序,而这个值就表示每组内部排序后的顺序编号(组内连续的唯一的)
    lead () 下一个值 lag() 上一个值

    【参数】
    EXPR是从其他行返回的表达式
    OFFSET是缺省为1 的正数,表示相对行数。希望检索的当前行分区的偏移量
    DEFAULT是在OFFSET表示的数目超出了分组的范围时返回的值。
    【说明】Oracle分析函数

    【示例】
    -- Create table
    create table LEAD_TABLE
    (
    CASEID VARCHAR2(10),
    STEPID VARCHAR2(10),
    ACTIONDATE DATE
    )
    tablespace COLM_DATA
    pctfree 10
    initrans 1
    maxtrans 255
    storage
    (
    initial 64K
    minextents 1
    maxextents unlimited
    );

    insert into LEAD_TABLE values('Case1','Step1',to_date('20070101','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case1','Step2',to_date('20070102','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case1','Step3',to_date('20070103','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case1','Step4',to_date('20070104','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case1','Step5',to_date('20070105','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case1','Step4',to_date('20070106','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case1','Step6',to_date('20070101','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case1','Step1',to_date('20070201','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case2','Step2',to_date('20070202','yyyy-mm-dd'));
    insert into LEAD_TABLE values('Case2','Step3',to_date('20070203','yyyy-mm-dd'));
    commit;
     

    结果如下:

    Case1 Step1 2007-1-1 Step2 2007-1-2
    Case1 Step2 2007-1-2 Step3 2007-1-3 Step1 2007-1-1
    Case1 Step3 2007-1-3 Step4 2007-1-4 Step2 2007-1-2
    Case1 Step4 2007-1-4 Step5 2007-1-5 Step3 2007-1-3
    Case1 Step5 2007-1-5 Step4 2007-1-6 Step4 2007-1-4
    Case1 Step4 2007-1-6 Step6 2007-1-7 Step5 2007-1-5
    Case1 Step6 2007-1-7 Step4 2007-1-6
    Case2 Step1 2007-2-1 Step2 2007-2-2
    Case2 Step2 2007-2-2 Step3 2007-2-3 Step1 2007-2-1
    Case2 Step3 2007-2-3 Step2 2007-2-2

    还可以进一步统计一下两者的相差天数

    select caseid,stepid,actiondate,nextactiondate,nextactiondate-actiondate datebetween from (
    select caseid,stepid,actiondate,lead(stepid) over (partition by caseid order by actiondate) nextstepid,
    lead(actiondate) over (partition by caseid order by actiondate) nextactiondate,
    lag(stepid) over (partition by caseid order by actiondate) prestepid,
    lag(actiondate) over (partition by caseid order by actiondate) preactiondate
    from lead_table)
    结果如下:

    Case1 Step1 2007-1-1 2007-1-2 1
    Case1 Step2 2007-1-2 2007-1-3 1
    Case1 Step3 2007-1-3 2007-1-4 1
    Case1 Step4 2007-1-4 2007-1-5 1
    Case1 Step5 2007-1-5 2007-1-6 1
    Case1 Step4 2007-1-6 2007-1-7 1
    Case1 Step6 2007-1-7
    Case2 Step1 2007-2-1 2007-2-2 1
    Case2 Step2 2007-2-2 2007-2-3 1
    Case2 Step3 2007-2-3
     

    每一条记录都能连接到上/下一行的内容

    lead () 下一个值 lag() 上一个值

    select caseid,stepid,actiondate,lead(stepid) over (partition by caseid order by actiondate) nextstepid,
    lead(actiondate) over (partition by caseid order by actiondate) nextactiondate,
    lag(stepid) over (partition by caseid order by actiondate) prestepid,
    lag(actiondate) over (partition by caseid order by actiondate) preactiondate
    from lead_table


     

    展开全文
  • ORACLE 常用函数——聚合函数

    千次阅读 2018-07-19 14:02:31
    ORACLE 常用函数    这个系列我将整理一些日常我们经常使用到的ORACLE函数,鉴于篇幅太长,我大体会按下面分类来整理、汇总这些常用的ORACLE函数,如果有些常用函数没有被整理进来,也希望大家指点一二。 ...
  • oracle分析函数汇总

    万次阅读 多人点赞 2018-07-03 15:00:47
    一、分析函数语法 function_name(,<argument>...) over(<partition_Clause><order by_Clause>); function_name():函数名称 argument:参数 over( ):开窗函数 partition_Clause:分区子句,数据记录集分组,group ...
  • oracle各种函数的使用

    2018-03-06 15:25:02
    SQL> select instr('oracle traning','ra',1,2) instring from dual;  INSTRING ---------  9 6.LENGTH 返回字符串的长度; SQL> select name,length(name),addr,length(addr),sal,length(to_char(sal)) from gao....
  • oracle函数(corr相关性系数)

    万次阅读 2016-05-16 17:04:30
    oracle分析函数--SQL*PLUS环境 一、总体介绍 12.1 分析函数如何工作 语法 FUNCTION_NAME(,…) OVER ( > ) PARTITION子句 ORDER BY子句 WINDOWING子句 缺省时相当于RANGE UNBOUNDED PRECEDING 1. 值域窗(RANGE ...
  • 一、分析函数语法 function_name(<argument>,<argument>...) over(<partition_Clause><order by_Clause><windowing_Clause>); function_name():函数名称 argument:参数 over( ):...
  • oracle中的聚合函数

    千次阅读 2018-11-13 21:28:16
    协方差 ALL表示对所有的值求协方差,DISTINCT表示只对不同的值求协方差 SQL> select variance(sal) from emp; VARIANCE(SAL) -------------  1398313.87   SQL> select variance(all sal) ...
  • Oracle所有分析函数

    万次阅读 多人点赞 2016-04-05 17:20:29
    Oracle分析函数   Oracle分析函数——函数列表   SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于...
  • Oracle常用函数

    2020-03-11 14:48:53
    文章目录一、Oracle函数1、单行函数2、聚合函数3、分析函数二、字符串函数1、ASCII码转换ascii和chr2、字符串拼接concat3、字符串查找instr4、字符串的长度length5、字符串大小写转换lower和upper6、截去字符串...
  • Oracle函数

    万次阅读 2015-11-22 16:55:30
    Oracle函数 函数的分类: 单行函数:对每行输入值进行计算,得到相应的计算结果,返回给用户,也就是说,每行作为一个输入参数,经过函数计算得到每行的计算结果。比如length 多行函数:对多行输入值进行计算,...
  • oracle函数大全

    千次阅读 2018-05-19 17:13:19
    F.1字符函数——返回字符值 (chr,concat,initcap,lower,lpad/rpad,nls_initcap,nls_lower,nls_upper,regexp_replace,regexp_substr,replace,trim/ltrim/rtrim,soundex,substr,translate,upper) 说明:可以sql和...
  • 一、分析函数、窗口函数一般形式 1、分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows) ,他们的使用形式如下:分析函数名(参数) over (partition ...
  • oracle 常用函数汇总

    千次阅读 2013-10-31 09:19:18
    Qeacle中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space fromdual; A A ZERO SPACE --------- --------- --------- -----...
  • oracle-函数详解

    千次阅读 2014-12-17 15:23:37
    许多资料(包括Oracle 的资料)把Oracle的SQL语句中用到的函数分为单值函数和多值函数,单值函数又分为字符函数和数字函数。下面分别介绍它们。 4.1、单记录 字符函数 函 数  说 明 ...
  • Oracle SQL 内置函数大全()

    千次阅读 2016-04-20 08:52:52
    Oracle SQL 内置函数大全 SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- -------...
  • Oracle分析函数

    2015-12-07 12:58:02
    Oracle分析函数——函数列表   SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算一个组和数据窗口内...
  • SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual; A A ZERO SPACE --------- --------- --------- --------- ...
  • Oracle函数大全

    千次阅读 2018-08-25 11:17:28
    SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL&gt; select ascii(’A’) A,ascii(’a’) a,ascii(’0’) zero,ascii(’ ’) space from dual; A A ZERO SPACE 65 97 48 32 2.CHR ...
  • 聚合函数 ------------------------------------------聚合函数--------------------------------------------- --1: AVG(DISTINCT|A...
  • SQL中的单记录函数 1.ASCII 返回与指定的字符对应的十进制数; SQL> select ascii('A') A,ascii('a') a,ascii('0') zero,ascii(' ') space from dual;  A A ZERO SPACE --------- --------- --------- -----
  • Oracle 分析函数

    千次阅读 2014-12-19 21:33:21
    说起 Oracle 分析函数,可以用很好很强大来形容。这项功能特别适用于各种统计查询,这些查询用通常的SQL很难实现,或者根本就无发实现。首先,我们从一个简单的例子开始,来一步一步揭开它神秘的面纱,请看下面的SQL...
  • Oracle 函数大全

    2018-09-29 14:12:05
    转自:...     F.1字符函数——返回字符值   (chr,concat,initcap,lower,lpad/rpad,nls_initcap,nls_lower,nls_upper,regexp_replace,regexp_substr,replace,t...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,795
精华内容 718
关键字:

oracle协方差函数