oracle分析函数(1)
2016-01-31 21:11
585 查看
1. oracle中日期转换为yyyy年mm月dd日的形式
2. oracle分析函数语法
2.1 ORDER BY
2.2 UNBOUNDED PRECEDING
窗口数据从第一行数据开始
2.3 UNBOUNDED FOLLOWING
窗口数据直到最后一行数据
2.4 RANGE
逻辑窗口
count(*) over(order by salary asc range between 1 preceding and 11 following)
假设当前行salary为1000,则当前行的count(*)为满足salary在(1000-1)和(1000+11)之间的数据行
count(*) over(order by salary desc range between 1 preceding and 11 following)
假设当前行salary为1000,则当前行的count(*)为满足salary在(1000-11)和(1000+1)之间的数据行
2.5 ROW
物理窗口
count(*) over(order by salary range between 1 preceding and 11 following)
假设当前行排名为N,则当前行的count(*)为满足排名在(N-1)和(N+11)之间的数据行
2.6 CURRENT ROW
从当前行开始或者以当前行结束
3.常用分析函数
3.1 AVG 平均数
3.2 CORR 求线性关系
如果存在线性关系的话correlation不为空,且salary线性等于hire_days * (1 + correlation)
3.3 count
3.4 covar_pop,
3.5 cume_dist,percent_rank 相对位置
3.6 dense_rank 排名可以重复,且不会跳跃。假设数据为10,9,9,8,8;从高到低排名为:1,2,2,3,3
3.7 rank 排名可以重复,会跳跃排序。假设数据为10,9,9,8,8;从高到低排名为:1,2,2,4,4
3.8 row_number 只能做为分析函数使用
select to_char(sysdate,'"年"mm"月"dd"日"') from dual;
2. oracle分析函数语法
2.1 ORDER BY
select e.last_name, e.manager_id, e.salary, avg(e.salary) over() as emp_count --等同于(select avg(*) from employees) from employees e;
select e.last_name, e.manager_id, e.salary, avg(e.salary) over(order by e.salary asc) as emp_count --按照阶梯取平均数 from employees e;
select e.last_name, e.manager_id, e.salary, e.job_id, avg(e.salary) over(partition by e.job_id) as emp_count --取每个工作的工资平均数 from employees e;
select e.last_name, e.manager_id, e.salary, e.job_id, avg(e.salary) over(partition by e.job_id order by e.salary asc) as emp_count --部门内按照阶梯取工资平均数 from employees e;
2.2 UNBOUNDED PRECEDING
窗口数据从第一行数据开始
2.3 UNBOUNDED FOLLOWING
窗口数据直到最后一行数据
2.4 RANGE
逻辑窗口
count(*) over(order by salary asc range between 1 preceding and 11 following)
假设当前行salary为1000,则当前行的count(*)为满足salary在(1000-1)和(1000+11)之间的数据行
count(*) over(order by salary desc range between 1 preceding and 11 following)
假设当前行salary为1000,则当前行的count(*)为满足salary在(1000-11)和(1000+1)之间的数据行
2.5 ROW
物理窗口
count(*) over(order by salary range between 1 preceding and 11 following)
假设当前行排名为N,则当前行的count(*)为满足排名在(N-1)和(N+11)之间的数据行
2.6 CURRENT ROW
从当前行开始或者以当前行结束
3.常用分析函数
3.1 AVG 平均数
select e.employee_id, e.last_name, e.salary, e.manager_id, avg(e.salary) over(partition by e.manager_id) --相同主管的平均工资 from employees e;
3.2 CORR 求线性关系
select e.last_name, e.hire_date, (sysdate - e.hire_date) hire_days, e.salary, e.job_id, corr(sysdate - e.hire_date, e.salary) over(partition by e.job_id) correlation from employees e order by e.job_id asc;
如果存在线性关系的话correlation不为空,且salary线性等于hire_days * (1 + correlation)
3.3 count
3.4 covar_pop,
COVAR_SAMP协方差
3.5 cume_dist,percent_rank 相对位置
--cume_dist 计算方法:相对位置/总行数,对于重复行取最后一个重复行的相对位置 --percent_rank 计算方法:(相对位置-1)/(总行数-1),对于重复行取第一个重复行的相对位置 --假设有一个人工资为15500,如下SQL可以查询15500比多少员工的工资高 select cume_dist(15500) within group(order by salary) from employees e; select percent_rank(15500) within group(order by salary) from employees e; --作为分析函数使用 --查询每个人的工资在相同主管下的大概位置 select e.last_name, e.salary, e.manager_id, cume_dist() over(partition by e.manager_id order by e.salary) from employees e; select e.last_name, e.salary, e.manager_id, percent_rank() over(partition by e.manager_id order by e.salary) from employees e;
3.6 dense_rank 排名可以重复,且不会跳跃。假设数据为10,9,9,8,8;从高到低排名为:1,2,2,3,3
--作为聚合函数使用 --假设有一个人工资为15500,如下SQL可以查询15500的工资排名 select dense_rank(15500) within group(order by salary) from employees e; --作为分析函数使用 --查询每个人的工资在相同主管下的工资排名 select e.last_name, e.salary, e.manager_id, dense_rank() over(partition by e.manager_id order by e.salary) from employees e;
3.7 rank 排名可以重复,会跳跃排序。假设数据为10,9,9,8,8;从高到低排名为:1,2,2,4,4
--作为聚合函数使用 --假设有一个人工资为15500,如下SQL可以查询15500的工资排名 select rank(15500) within group(order by salary) from employees e; --作为分析函数使用 --查询每个人的工资以及工资排名 select e.last_name, e.salary, e.manager_id, rank() over(order by e.salary) from employees e;
3.8 row_number 只能做为分析函数使用
--查询每种工作排名前三的人的姓名及工资 select * from (select e.last_name, e.salary, e.job_id, row_number() over(partition by e.job_id order by e.salary desc) rn from employees e) v where v.rn < 4
相关文章推荐
- linux下oracle lsnrctl stat后无反应而SQLPLUS正常的故障
- 关于oracle with as用法
- 使用wrap和unwrap加密解密Oracle的PL/SQL对象(包,存储过程,函数等)代码
- ORACLE如何停止一个JOB
- Oracle--sqlplus如何设置SQLPlus结果显示的宽度
- Oracle 优化 - CPU 问题
- Oracle 11g对大表中添加DEFAULT值的NOT NULL字段速度有大幅度的提升
- 普通单表上建立分区索引测试
- oracle 常用命令
- 在Maven仓库中添加Oracle JDBC驱动
- Linux Is Not Matrix——Linux下的Oracle 11g安装
- Oracle表空间和表的区别
- springmvc整合mybatis框架源码 bootstrap html5 mysql oracle
- Oracle高级查询
- Oracle单节点开启关闭归档日志
- 基于OCILIB的oracle数据库操作总结及自动生成Model和Dao的工具
- Oracle SGA 、PGA配置规则
- Oracle RAC 11R2配置归档、删除策略,闪回配置完整版
- Oracle RAC 11R2归档、闪回删除策略配置完整版
- RAC 11R2 单表决盘触发的bug(ID 1466639.1)