oracle分析函数(2)

常用分析函数:

1. first,last

--假设a := min(奖金) keep(dense_rank first order by 工资)
--假设工资最少为1000,a为在工资等于1000的员工取最小的奖金
--假设b := min(奖金) keep(dense_rank last order by 工资)
--假设工资最多为9999,b为在工资等于9999的员工取最小的奖金
--作为聚合函数
select e.department_id,
       min(e.hire_date) keep(dense_rank first order by e.salary), --工资最低的员工中,最早入职的入职日期
       max(e.hire_date) keep(dense_rank first order by e.salary), --工资最低的员工中,最晚入职的入职日期
       min(e.hire_date) keep(dense_rank last order by e.salary), --工资最高的员工中,最早入职的入职日期
       max(e.hire_date) keep(dense_rank last order by e.salary) --工资最高的员工中,最晚入职的入职日期
  from employees e
 group by e.department_id;

--作为分析函数
select e.last_name,
       e.salary,
       e.department_id,
       e.manager_id,
       min(e.hire_date) keep(dense_rank first order by e.salary) over(partition by e.department_id), --每个部门工资最低的员工中,最早入职的入职日期
       max(e.hire_date) keep(dense_rank first order by e.salary) over(partition by e.department_id), --每个部门工资最低的员工中,最晚入职的入职日期
       min(e.hire_date) keep(dense_rank last order by e.salary) over(partition by e.department_id), --每个部门工资最高的员工中,最早入职的入职日期
       max(e.hire_date) keep(dense_rank last order by e.salary) over(partition by e.department_id) --每个部门工资最高的员工中,最晚入职的入职日期
  from employees e;

2.first_value,last_value只能作为分析函数使用

--first_value,last_value
select e.employee_id,
       e.last_name,
       e.salary,
       e.department_id,
       first_value(last_name) over(partition by e.department_id) --部门内第一个员工(排序方式好像不是稳定的,可以先排序再开窗)
  from employees e;

select e.employee_id,
       e.last_name,
       e.salary,
       e.department_id,
       last_value(last_name) over(partition by e.department_id) --部门内最后一个员工(排序方式好像不是稳定的,可以先排序再开窗)
  from employees e;

select e.employee_id,
       e.last_name,
       e.salary,
       e.department_id,
       first_value(last_name) over(partition by e.department_id order by e.salary) --部门内部按照价格升序阶梯取第一个人(工资最低的人的姓名),因为是价格升序所以部门内部第一个人的姓名不会变化
  from employees e;

select e.employee_id,
       e.last_name,
       e.salary,
       e.department_id,
       last_value(last_name) over(partition by e.department_id order by e.salary) --部门内部按照价格升序阶梯取最后一个人(工资最高的人的姓名),因为是价格升序所以部门最后一个人的的姓名有可能变化
  from employees e;

3.lag,lead只能作为分析函数使用

--lag(arg1,arg2,arg3)
--查询当前行之前的第arg2行数据的arg1的值,如果未找到默认为arg3,如果arg3不声明,默认为空
--lead(arg1,arg2,arg3)
--查询当前行之后的第arg2行数据的arg1的值,如果未找到默认为arg3,如果arg3不声明,默认为空
select e.last_name,
       e.hire_date,
       e.salary,
       lag(e.salary, 1, 0) over(order by e.hire_date)--自己之前入职的第一个员工的工资
  from employees e;

select e.last_name,
      e.hire_date,
      e.salary,
      lead(e.salary, 1, 0) over(order by e.hire_date)--自己之后入职的第一个员工的工资
 from employees e;

4. list_agg

--作为单组分组函数
select listagg(e.last_name, ‘;‘) within group(order by e.hire_date), --部门号为30的所有员工姓名
       min(e.hire_date),
       max(e.hire_date)
  from employees e
 where e.department_id = 30;

--作为聚合函数
select listagg(e.last_name, ‘;‘) within group(order by e.hire_date), --各部门的所有员工姓名
       min(e.hire_date),
       max(e.hire_date)
  from employees e
 group by e.department_id;

--作为聚合函数
select e.last_name,
       e.department_id,
       listagg(e.last_name, ‘;‘) within group(order by e.hire_date) over(partition by e.department_id) --over后不能加order by
  from employees e;

5.median 中位数

时间: 2024-10-21 13:08:23

oracle分析函数(2)的相关文章

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) f

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表中每个部门工资前三位