oracle 分析函数

1.和聚合函数相似,但对于每一组数据,聚合函数只返回一行,而分析函数对其中的每一行都有返回值。

2.这一组记录,称为分析函数的一个窗口(window)

3.由窗口决定了要处理数据的范围,该范围在物理上可以由指定的行数来确定,或者逻辑上由相对偏移量来确定。

4.分析函数总是在出了order by 之外其他子句运算后才执行的,所以他不能出现在where、group by等子句中,

只能出现在select和order by 子句中。

order 对于窗口的影响:

1.不含order by,默认的窗口是从结果集的第一行至最后一行

例:select deptno,sal,sum(sal) over() from emp;

2.含有order by,默认窗口是第一行至当前分组的最后一行

select deptno,sal,sum(sal) over(order by deptno) as sumsal from emp;

用于合计的函数:

select deptno,sal, sum(sal) over (partition by deptno) as sumsal,
     avg(sal) over (partition by deptno) as avgsal,

     count(*) over (partition by deptno) as count,  

       max(sal) over (partition by deptno) as maxsal   

from emp;

 

 

 

 

sql分析函数-排名:

row_number() over(partition by  col order by  col) 没有重复的值

rank() over(partition by col order by col) 跳跃排序,有两个第二名,接下来是第四名

dense_rank() over(partition by col order by col) 连续排序,有两个第二名,接下来是第三名

sql分析函数-相邻:

lag(v,n,dv) 是取到排序后当前记录之前的记录

lead(v,n,dv) 是取到排序后当前记录之后的记录

其中v是必须的,可以是字符串抑或是整数,n表示位移,必须是0或者是整数,dv是

在没有取到对应值得默认值。n默认为1,dv默认为null

1.用于获取相邻行的数据,以便进行相关计算,例如同比,环比

SELECT EMPLOYEENO
      ,YEARMONTH
      ,SALARY
      ,MIN(SALARY) KEEP(DENSE_RANK FIRST ORDER BY YEARMONTH) OVER(PARTITION BY EMPLOYEENO) FIRST_SALARY -- 基比分析 salary/first_salary ,基比即与某一固定时期相比
      ,LAG(SALARY, 1, 0) OVER(PARTITION BY EMPLOYEENO ORDER BY YEARMONTH) AS PREV_SAL -- 环比分析,与上个月份进行比较 
      ,LAG(SALARY, 12, 0) OVER(PARTITION BY EMPLOYEENO ORDER BY YEARMONTH) AS PREV_12_SAL -- 同比分析,与上个年度相同月份进行比较    
      ,SUM(SALARY) OVER(PARTITION BY EMPLOYEENO, SUBSTR(YEARMONTH, 1, 4) ORDER BY YEARMONTH RANGE UNBOUNDED PRECEDING) LJ --累计值
  FROM SALARYBYMONTH
 ORDER BY EMPLOYEENO
         ,YEARMONTH

2.实现重复数据只输出第一个的需求

select (

      case when deptno=lag(deptno,1,-1) over(partiion by deptno order by ename) 

   then null

   else deptno end  

) deptno ,

lag(ename,1,'AAA') over(partition by deptno order by ename) lower_name

from emp;

 

posted @ 2020-04-05 22:43  renzy194  阅读(223)  评论(0编辑  收藏  举报