您的位置:首页 > 数据库 > Oracle

oracle分析函数使用

2015-07-06 14:15 525 查看
select o.deptno,

       o.job,

       sum(o.sal),

       rank() over(order by sum(o.sal) desc),

       dense_rank() over(order by sum(o.sal) desc),

       row_number() over(partition by o.deptno order by sum(o.sal) desc),

       sum(sum(o.sal)) over(partition by o.deptno order by o.job)

  from emp o

 where deptno in (10, 20, 30)

   and job is not null

 group by o.deptno, o.job
 order by o.deptno;

order by子句

 

 select ename,sal,avg(sal)over() from emp where rownum<=3;

 select ename,sal,avg(sal)over(order by ename) from emp where rownum<=3;

上面的2个结果是不同的,没有添加order by 子句的,默认的窗口是所有的分区,加了order by子句的,会将当前行与前面的行计算平均值。

查看当前人与其他员工工资差异在50~150的数量

 select empno,ename,sal,count(*) over(order by sal range between 50 preceding and 150 following) from emp;

查看同一部门中的雇佣日期比当前员工早的员工的最低薪水与最高薪水

 select deptno,

        empno,

        ename,

        hiredate,

        sal,

        min(sal) over(partition by deptno order by hiredate range unbounded preceding),

        max(sal) over(partition by deptno order by hiredate range unbounded preceding)

   from emp;

range unbounded preceding作用是从第1行开始比较hiredate直到到达当前行为止。

first_value与last_value分别用于返回over子句中查询出来的第一条记录和最后一条记录

查看当前雇员的前一个和后一个雇员的薪水

lag(col【,n1】[n2]) 返回指定列col前n1行的值,如果n1行超出了比照的范围,则返回n2,如果不指定n2,默认返回null

select ename,hiredate,sal,deptno,lag(sal,1,0)over(order by hiredate),lead(sal,1,0)over(order by hiredate) from emp where deptno=30;

查看薪资在前1/3的员工列表

select *

  from (select deptno,

               empno,

               ename,

               sum(sal),

               ntile(3) over(partition by deptno order by sum(sal) nulls last) rank_ratio

          from emp

         where deptno is not null

         group by deptno, empno, ename)

 where rank_ratio = 1;

范围查询,查看smith入职前10天和后10天新进员工的最高薪资

select empno,

       ename,

       hiredate,

       sal,

       max(sal) over(order by hiredate rows between 10 preceding and current row),

       max(sal) over(order by hiredate rows between current row and 10 following)

  from emp

 where deptno in (10, 20, 30)

   and sal is not null;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  oracle分析函数