Oracle分析函数二——函数用法

简介:
Oracle 分析函数——函数用法
  Oracle 分析函数实际上操作对象是查询出的数据集,也就是说不需二次查询数据库 ,实际上就是 oracle 实现了一些我们自身需要编码实现的统计功能,对于简化开发工作量有很大的帮助,特别在开发第三方报表 软件 时是非常有帮助的。 Oracle 从 8.1.6 开始提供分析函数。
oracle 分析函数的语法:
function_name(arg1,arg2,...)
over
(<partition-clause> <order-by-clause ><windowing clause>)
      说明:
1. partition-clause  数据记录集分组
2. order-by-clause   数据记录集排序
3. windowing clause  功能非常强大、比较复杂,定义分析函数在操作行的集合。有三种开窗方式 : range 、 row 、 specifying 。
 
--Partition by ,按相应的值 (manager_id) 进行分组统计
SELECT
 manager_id,
 first_name||' '||last_name employee_name,
  hire_date,
 salary,
 AVG(salary) OVER (PARTITION BY manager_id) avg_salary
FROM employees;
 
-- 等同于上面
SELECT
 a.manager_id,
 a.employee_name,
 a.hire_date,
 a.salary,
 b.avg_salary
FROM
(
 SELECT
   manager_id,
   first_name||' '||last_name employee_name,
   hire_date,
   salary
   FROM employees
) a,
(
 SELECT
   manager_id,
   AVG(salary) avg_salary
   FROM employees
  GROUP BY manager_id
) b
WHERE a.manager_id=b.manager_id
ORDER BY a.manager_id
 
--Order by 按相应的值 (hire_date) 进行排序并累计统计
SELECT
 manager_id,
 first_name||' '||last_name employee_name,
 hire_date,
 salary,
 AVG(salary) OVER (ORDER BY hire_date)
FROM employees;
 
--Partition by Order by 首先按相应的值 (manager_id,hire_date) 排序,并按 order by 的值 (hire_date) 进行累计统计
SELECT
 manager_id,
 first_name||' '||last_name employee_name,
 hire_date,
 salary,
 AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date)
FROM employees;
 
 
--Partition by Order by 首先按相应的值 (manager_id,hire_date) 排序,并按 order by 的值 (hire_date) 进行累计统计
-- 该平均值由当前员工和与之具有相同经理的前一个和后两个三者的平均数得来
SELECT
 manager_id,
 first_name||' '||last_name employee_name,
 hire_date,
 salary,
 AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date ROWS BETWEEN 1 PRECEDING AND 2 FOLLOWING)
FROM employees;
 
 
 
--Partition by Order by 首先按相应的值 (manager_id,hire_date) 排序,并按 order by 的值 (hire_date) 进行累计统计
-- 该平均值由当前员工和与之具有相同经理 , 并且雇用时间在该员工时间之前的 50 天以内和在该员工之后的 150 天之内员工的薪水的平均值
--range 为取值范围,估计只有数字和日期能够进行取值了
SELECT
 manager_id,
 first_name||' '||last_name employee_name,
 hire_date,
 salary,
 AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date RANGE BETWEEN 50 PRECEDING AND 150 FOLLOWING)
FROM employees;
 
--Partition by Order by 首先按相应的值 (manager_id,hire_date) 排序,并按 order by 的值 (hire_date) 进行累计统计
-- 该平均值由当前员工和与之具有相同经理的平均值
-- 每行对应的数据窗口是从第一行到最后一行
SELECT
 manager_id,
 first_name||' '||last_name employee_name,
 hire_date,
 salary,
 AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date) avg_salary_part_order,
 AVG(salary) OVER (PARTITION BY manager_id ) avg_salary_order, 
 AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) avg_salary_unbound1, -- 等同于仅 partition 时候的值
 AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) avg_salary_unbound2-- 等同于上面
FROM employees;
 
 






本文转自baoqiangwang51CTO博客,原文链接:http://blog.51cto.com/baoqiangwang/312695,如需转载请自行联系原作者
相关文章
|
1月前
|
Oracle 关系型数据库 数据库
Oracle中merge Into的用法
Oracle中merge Into的用法
|
4月前
|
SQL Oracle 关系型数据库
Oracle之日期计算相关函数
Oracle之日期计算相关函数
43 0
|
4月前
|
SQL Oracle 关系型数据库
Oracle之regexp系列函数详解
Oracle之regexp系列函数详解
126 1
|
7月前
|
存储 SQL Oracle
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
Oracle数据库批量删除表、视图、序列、存储过程、函数脚本
68 0
|
3月前
|
存储 Java 数据库
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(二)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
34 0
|
3月前
|
SQL Oracle 关系型数据库
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
66 0
JAVAEE框架数据库技术之12_oracle常用函数和高级查询子查询
|
2月前
|
SQL Oracle 关系型数据库
Oracle查询优化-聚集函数
【2月更文挑战第5天】【2月更文挑战第13篇】聚集函数
19 4
|
3月前
|
存储 SQL Java
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数(一)
JAVAEE框架数据库技术之13_oracle 之PLSQL技术及存储过程和函数
35 0
|
3月前
|
SQL Oracle 算法
Oracle函数
Oracle函数
97 1
|
4月前
|
SQL Oracle 关系型数据库
Oracle之有哪些日期计算函数?
Oracle之有哪些日期计算函数?
114 0