ORACEL学习--理解over()函数

2、理解over()函数

1.一、两个order by的执行时机
分析函数是在整个sql查询结束后(sql语句中的order by的执行比较特殊)再进行的操做, 也就是说sql语句中的order by也会影响分析函数的执行结果:html

a) 二者一致:若是sql语句中的order by知足分析函数分析时要求的排序,那么sql语句中的排序将先执行,分析函数在分析时就没必要再排序;
b) 二者不一致:若是sql语句中的order by不知足分析函数分析时要求的排序,那么sql语句中的排序将最后在分析函数分析结束后执行排序。sql

           

1.二、分析函数中的分组/排序/窗口
      分析函数包含三个分析子句:分组(partition by), 排序(order by), 窗口(rows)
      窗口就是分析函数分析时要处理的数据范围,就拿sum来讲,它是sum窗口中的记录而不是整个分组中的记录,所以咱们在想获得某个栏位的累计值时,咱们须要把窗口指定到该分组中的第一行数据到当前行, 若是你指定该窗口从该分组中的第一行到最后一行,那么该组中的每个sum值都会同样,即整个组的总和。函数

      窗口子句在这里我只说rows方式的窗口,range方式和滑动窗口也不提。
      窗口子句中咱们常常用到指定第一行,当前行,最后一行这样的三个属性。
第一行是 unbounded preceding,
当前行是 current row,
最后一行是 unbounded following,
窗口子句不能单独出现,必须有order by子句时才能出现,如:spa

last_value(sal) over(partition by deptno 
                     order by sal 
                     rows between unbounded preceding and unbounded following)

以上示例指定窗口为整个分组。而出现order by子句的时候,不必定要有窗口子句,但效果会很不同,此时的窗口默认是当前组的第一行到当前行!3d

 

当省略窗口子句时:
a) 若是存在order by则默认的窗口是unbounded preceding and current row  --当前组的第一行到当前行
b) 若是同时省略order by则默认的窗口是unbounded preceding and unbounded following  --整个组htm

              
若是省略分组,则把所有记录当成一个组:
a) 若是存在order by则默认窗口是unbounded preceding and current row   --当前组的第一行到当前行
b) 若是这时省略order by则窗口默认为unbounded preceding and unbounded following  --整个组blog

     

1.三、帮助理解over()的实例排序

例1:关注点:sql无排序,over()排序子句省略get

SELECT DEPTNO, EMPNO, ENAME, SAL, 
       LAST_VALUE(SAL) OVER(PARTITION BY DEPTNO)
FROM EMP;

运行结果:it

 

        

例2:关注点:sql无排序,over()排序子句有,窗口省略

 

复制代码

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

复制代码

运行结果:

 

                   
例3:关注点: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;

复制代码

运行结果:

 

      
例4:关注点:sql有排序(正序),over()排序子句无,先作sql排序再进行分析函数运算

 

复制代码

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

复制代码

运行结果:

 

 



例5:关注点:sql有排序(倒序),over()排序子句无,先作sql排序再进行分析函数运算

 

复制代码

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

复制代码

运行结果:

                 

例6:关注点:sql有排序(倒序),over()排序子句有,窗口子句无,此时的运算是:sql先选数据可是不排序,然后排序子句先排序并进行分析函数处理(窗口默认为第一行到当前行),最后再进行sql排序

 

 

复制代码

SELECT DEPTNO,
       MGR,
       ENAME,
       SAL,
       HIREDATE,
       MIN(SAL) OVER(PARTITION BY DEPTNO ORDER BY SAL ASC) LAST_VALUE
  FROM EMP
 WHERE DEPTNO = 30
 ORDER BY DEPTNO, MGR DESC;

复制代码

运行结果:

 

复制代码

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

复制代码

运行结果:

相关文章
相关标签/搜索