ORACLE分析函数(1)

1. oracle中日期转换为yyyy年mm月dd日的形式

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 相对位置

  

--假设有一个人工资为15500,如下SQL可以查询15500比多少员工的工资高
select cume_dist(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;

  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 

 

  

时间: 2024-10-28 11:14:37

ORACLE分析函数(1)的相关文章

Oracle分析函数学习总结

在公司经常会用到oracle分析函数,在统计这块用处很大,特别是复杂的sql查询,我就在这边结合网络一些资料进行了总结,希望可以帮助到大家: Oracle分析函数--函数列表 SUM         :该函数计算组中表达式的累积和 MIN         :在一个组中的数据窗口中查找表达式的最小值 MAX         :在一个组中的数据窗口中查找表达式的最大值 AVG          :用于计算一个组和数据窗口内表达式的平均值. COUNT       :对一组内发生的事情进行累积计数 -

Oracle分析函数用法(二)

Oracle分析函数--函数用法 Oracle分析函数实际上操作对象是查询出的数据集,也就是说不需二次查询数据库,实际上就是oracle实现了一些我们自身需要编码实现的统计功能,对于简化开发工作量有很大的帮助,特别在开发第三方报表软件时是非常有帮助的.Oracle从8.1.6开始提供分析函数. oracle分析函数的语法: function_name(arg1,arg2,...) over (<partition-clause> <order-by-clause ><wind

Oracle分析函数入门

一.Oracle分析函数入门 分析函数是什么?分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值. 分析函数和聚合函数的不同之处是什么?普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值. 分析函数的形式分析函数带有一个开窗函数over(),包含三个分析子句:分组(partition by), 排序(or

[Oracle] 分析函数(1)- 语法

语法概述 Analytic-Function Analytic_Clause之PARTITION子句 Analytic_Clause之ORDER BY子句 Analytic_Clause之WINDOWING子句 举例: 下面看一个例子简单过下语法: 例: sum(sal) over (partition by deptno order by ename) new_alias sum就是函数名 (sal)是分析函数的参数,每个函数有0~3个参数,参数可以是表达式,例如:sum(sal+comm)

Oracle分析函数Over()

一.Over()分析函数 说明:聚合函数(如sum().max()等)可以计算基于组的某种聚合值,但是聚合函数对于某个组只能返回一行记录.若想对于某组返回多行记录,则需要使用分析函数. 1.rank()/dense_rank over(partition by ... order by ...) 说明:over()在什么条件之上; partition by 按哪个字段划分组: order by 按哪个字段排序: 注意: (1)使用rank()/dense_rank() 时,必须要带order b

oracle分析函数 (转)

一.总体介绍 12.1 分析函数如何工作 语法 FUNCTION_NAME(<参数>,…) OVER (<PARTITION BY 表达式,…> <ORDER BY 表达式 <ASC DESC> <NULLS FIRST NULLS LAST>> <WINDOWING子句>) PARTITION子句 ORDER BY子句 WINDOWING子句 缺省时相当于RANGE UNBOUNDED PRECEDING 1. 值域窗(RANGE

[转]oracle分析函数Rank, Dense_rank, row_number

oracle分析函数Rank, Dense_rank, row_number 分析函数2(Rank, Dense_rank, row_number)   目录 =============================================== 1.使用rownum为记录排名 2.使用分析函数来为记录排名 3.使用分析函数为记录进行分组排名 一.使用rownum为记录排名: 在前面一篇<Oracle开发专题之:分析函数>,我们认识了分析函数的基本应用,现在我们再来考虑下面几个问题:

[转]oracle 分析函数over

  oracle 分析函数over 分析函数(OVER) 目录: =============================================== 1.Oracle分析函数简介 2. Oracle分析函数简单实例 3.分析函数OVER解析 一.Oracle分析函数简介: 在日常的生产环境中,我们接触得比较多的是OLTP系统(即Online Transaction Process),这些系统的特点是具备实时要求,或者至少说对响应的时间多长有一定的要求:其次这些系统的业务逻辑一般比较复

Oracle 分析函数

Oracle分析函数 --row_number():连续不重复 1234567 --rank():跳跃可重复 12333678 --dense_rank():连续可重复 12333456 row_number() over(partition by deptno order by sal desc) over( partition by [分区字段,可以有多个] order by [一个或多个字段]) 笔试题题目如下: 题目如下: 请用一条sql语句查询出scott.emp表中每个部门工资前三位