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;
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;
相关文章推荐
- 第六章 使用数字
- 分析函数用法及窗口子句 range/rows差别
- Oracle分析函数
- Oracle函数
- Oracle分析函数
- MYBATIS: Use Oracle Function
- Oracle Instanc Client安装命令工具
- oracle 学习摘录
- Oracle变量定义的三种方式(define,variable,declare)学习笔记
- 利用Oracle分析函数实现多行数据合并为一行
- APP-PER-50022: Oracle Human Resources could not retrieve a value for the User Type profile option.
- Oracle11g用户密码过期
- ORA-12899:列"DP"."META_KPI"."KPI_UNIT"的值太大(实际值:24,最大值20)
- C#中一次执行多条Oracle语句出现ORA-00911,invalid character
- Oracle中job的使用详解
- 总结ORACLE和MYSQL的一些区别
- oracle临时表
- Oracle Log Miner工具说明
- Oracle Session被kill后如何获取会话的进程号
- ubuntu 安装 oracle 11g xe