Analytic functions are commonly used in data warehousing environments. In the list of analytic functions that follows, functions followed by an asterisk (*) allow the full syntax, including the windowing_clause.

分析函数一般用于数据仓库环境。以下是分析函数列表,其中带星号的表示支持窗口语句windowing_clause.

AVG *

CORR *

COVAR_POP *

COVAR_SAMP *

COUNT *

CUME_DIST

DENSE_RANK

FIRST

FIRST_VALUE *

LAG

LAST

LAST_VALUE *

LEAD

MAX *

MIN *

NTILE

PERCENT_RANK

PERCENTILE_CONT

PERCENTILE_DISC

RANK

RATIO_TO_REPORT

REGR_ (Linear Regression) Functions *

ROW_NUMBER

STDDEV *

STDDEV_POP *

STDDEV_SAMP *

SUM *

VAR_POP *

VAR_SAMP *

VARIANCE *

-------------------------------------------------------------------

1、AVG   为聚合函数用于求平均:

  1. SELECT manager_id, last_name, hire_date, salary,
  2. AVG(salary) OVER (PARTITION BY manager_id ORDER BY hire_date
  3. ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING) AS c_mavg
  4. FROM employees;
  5.  
  6. MANAGER_ID LAST_NAME HIRE_DATE SALARY C_MAVG
  7. ---------- ------------------------- --------- ---------- ----------
  8. 100 Kochhar 21-SEP-89 17000 17000
  9. 100 De Haan 13-JAN-93 17000 15000
  10. 100 Raphaely 07-DEC-94 11000 11966.6667
  11. 100 Kaufling 01-MAY-95 7900 10633.3333
  12. 100 Hartstein 17-FEB-96 13000 9633.33333
  13. 100 Weiss 18-JUL-96 8000 11666.6667
  14. 100 Russell 01-OCT-96 14000 11833.3333

2、CORR 返回一对表达式的相关系数:

  1. SELECT employee_id, job_id,
  2. TO_CHAR((SYSDATE - hire_date) YEAR TO MONTH ) "Yrs-Mns", salary,
  3. CORR(SYSDATE-hire_date, salary)
  4. OVER(PARTITION BY job_id) AS "Correlation"
  5. FROM employees
  6. WHERE department_id in (50, 80)
  7. ORDER BY job_id, employee_id;
  8.  
  9. EMPLOYEE_ID JOB_ID Yrs-Mns SALARY Correlation
  10. ----------- ---------- ------- ---------- -----------
  11. 145 SA_MAN +08-07 14000 .912385598
  12. 146 SA_MAN +08-04 13500 .912385598
  13. 147 SA_MAN +08-02 12000 .912385598
  14. 148 SA_MAN +05-07 11000 .912385598
  15. 149 SA_MAN +05-03 10500 .912385598
  16. 150 SA_REP +08-03 10000 .80436755
  17. 151 SA_REP +08-02 9500 .80436755
  18. 152 SA_REP +07-09 9000 .80436755
  19. 153 SA_REP +07-01 8000 .80436755
  20. 154 SA_REP +06-05 7500 .80436755
  21. 155 SA_REP +05-06 7000 .80436755

3、COVAR_POP  返回一对表达式的总体协方差;

4、COVAR_SAMP 返回一对表达式的样本协方差;

5、COUNT 返回总行数:(每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150)

  1. SELECT last_name, salary,
  2. COUNT(*) OVER (ORDER BY salary RANGE BETWEEN 50 PRECEDING
  3. AND 150 FOLLOWING) AS mov_count FROM employees;
  4.  
  5. LAST_NAME SALARY MOV_COUNT
  6. ------------------------- ---------- ----------
  7. Olson 2100 3
  8. Markle 2200 2
  9. Philtanker 2200 2
  10. Landry 2400 8
  11. Gee 2400 8
  12. Colmenares 2500 10
  13. Patel 2500 10
  14. . . .

6、dense_rank 返回排名,用于TOPN查询:

查询假设薪资15500 、佣金5%的员工在employees表中排名

  1. SELECT DENSE_RANK(15500, .05) WITHIN GROUP
  2. (ORDER BY salary DESC, commission_pct) "Dense Rank"
  3. FROM employees;
  4.  
  5. Dense Rank
  6. -------------------
  7. 3
  1. SELECT d.department_name, e.last_name, e.salary, DENSE_RANK()
  2. OVER (PARTITION BY e.department_id ORDER BY e.salary) AS drank
  3. FROM employees e, departments d
  4. WHERE e.department_id = d.department_id
  5. AND d.department_id IN ('30', '40');
  6.  
  7. DEPARTMENT_NAME LAST_NAME SALARY DRANK
  8. ----------------------- ------------------ ---------- ----------
  9. Purchasing Colmenares 2500 1
  10. Purchasing Himuro 2600 2
  11. Purchasing Tobias 2800 3
  12. Purchasing Baida 2900 4
  13. Purchasing Khoo 3100 5
  14. Purchasing Raphaely 11000 6
  15. Human Resources Marvis 6500 1

7、first 当所查字段不是排序字段时返回分组范围内最大、最小值:

  1. SELECT last_name, department_id, salary,
  2. MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)
  3. OVER (PARTITION BY department_id) "Worst",
  4. MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
  5. OVER (PARTITION BY department_id) "Best"
  6. FROM employees
  7. ORDER BY department_id, salary;
  8.  
  9. LAST_NAME DEPARTMENT_ID SALARY Worst Best
  10. ------------------- ------------- ---------- ---------- ----------
  11. Whalen 10 4400 4400 4400
  12. Fay 20 6000 6000 13000
  13. Hartstein 20 13000 6000 13000
  14. . . .
  15. Gietz 110 8300 8300 12000
  16. Higgins 110 12000 8300 12000
  17. Grant 7000 7000 7000
  1. SELECT last_name, department_id, salary,
  2. MIN(salary) KEEP (DENSE_RANK FIRST ORDER BY commission_pct)
  3. OVER (PARTITION BY department_id) "Worst",
  4. MAX(salary) KEEP (DENSE_RANK LAST ORDER BY commission_pct)
  5. OVER (PARTITION BY department_id) "Best"
  6. FROM employees
  7. ORDER BY department_id, salary;

8、fist_value 返回一组有序值中第一个值

  1. SELECT department_id, last_name, salary, FIRST_VALUE(last_name)
  2. OVER (ORDER BY salary ASC ROWS UNBOUNDED PRECEDING) AS lowest_sal
  3. FROM (SELECT * FROM employees WHERE department_id = 90
  4. ORDER BY employee_id);
  5.  
  6. DEPARTMENT_ID LAST_NAME SALARY LOWEST_SAL
  7. ------------- ------------- ---------- -------------------------
  8. 90 Kochhar 17000 Kochhar
  9. 90 De Haan 17000 Kochhar
  10. 90 King 24000 Kochhar

9、lag与lead函数是跟偏移量相关的两个分析函数,通过这两个函数我们可以取到当前行列的偏移N行列的值 lag可以看着是正的向上的偏移 lead可以认为负的向下的偏移

  1. SELECT last_name, hire_date, salary,
  2. LAG(salary, 1, 0) OVER (ORDER BY hire_date) AS prev_sal
  3. FROM employees
  4. WHERE job_id = 'PU_CLERK';
  1. select deptno,
  2. sal a,
  3. lag(sal, 1, null) over(partition by deptno order by deptno) b
  4. from scott.emp
  1. SELECT last_name, hire_date,
  2. LEAD(hire_date, 1) OVER (ORDER BY hire_date) AS "NextHired"
  3. FROM employees WHERE department_id = 30;

10、min/max 分别用于返回分组最小值/最大值:

  1. SELECT manager_id, last_name, salary
  2. FROM (SELECT manager_id, last_name, salary,
  3. MAX(salary) OVER (PARTITION BY manager_id) AS rmax_sal
  4. FROM employees) WHERE salary = rmax_sal;
  1. SELECT manager_id, last_name, hire_date, salary,
  2. MIN(salary) OVER(PARTITION BY manager_id ORDER BY hire_date
  3. RANGE UNBOUNDED PRECEDING) AS p_cmin
  4. FROM employees;

11、rank 类似于dense_rank 区别在于其排名数字不连续

  1. SELECT RANK(15500) WITHIN GROUP
  2. (ORDER BY salary DESC) "Rank of 15500"
  3. FROM employees;
  1. SELECT department_id, last_name, salary, commission_pct,
  2. RANK() OVER (PARTITION BY department_id
  3. ORDER BY salary DESC, commission_pct) "Rank"
  4. FROM employees WHERE department_id = 80;

12、row_number 和rownum差不多,功能更强一点(可以在各个分组内从1开始排序)

  1. SELECT department_id, last_name, employee_id, ROW_NUMBER()
  2. OVER (PARTITION BY department_id ORDER BY employee_id) AS emp_id
  3. FROM employees;

13、
RATIO_TO_REPORT 用来计算当前记录的指标expr占开窗函数over中包含记录的所有同一指标的百分比. 这里如果开窗函数的统计结果为null或者为0,就是说占用比率的被除数为0或者为null, 则得到的结果也为0

  1. SELECT last_name, salary, RATIO_TO_REPORT(salary) OVER () AS rr
  2. FROM employees
  3. WHERE job_id = 'PU_CLERK';

14、SUM

  1. SELECT manager_id, last_name, salary,
  2. SUM(salary) OVER (PARTITION BY manager_id ORDER BY salary
  3. RANGE UNBOUNDED PRECEDING) l_csum
  4. FROM employees;

to be continue...

------------------------

Dylan    Presents.

------------------------------------

Dylan   Presents.

Oracle 分析函数详解(Analytic Functions)--示例部分的更多相关文章

  1. 常用Oracle分析函数详解 [http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html]

      学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理 ...

  2. 常用Oracle分析函数详解

    学习步骤:1. 拥有Oracle EBS demo 环境 或者 PROD 环境2. copy以下代码进 PL/SQL3. 配合解释分析结果4. 如果网页有点乱请复制到TXT中查看 /*假设一个经理代表 ...

  3. 问题:Oracle出发器;结果:1、Oracle触发器详解,2、Oracle触发器示例

    ORACLE触发器详解 本篇主要内容如下: 8.1 触发器类型 8.1.1 DML触发器 8.1.2 替代触发器 8.1.3 系统触发器 8.2 创建触发器 8.2.1 触发器触发次序 8.2.2 创 ...

  4. oracle 数据类型详解---日期型(转载)

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享: 注:由于INTER ...

  5. oracle rowid 详解

    oracle rowid详解 今天是2013-09-15,存储在数据库中的每一行数据都有一个地址,oracle使用rowid数据类型在存储地址.rowid有如下类别: 1)physical rowid ...

  6. Oracle索引详解

    Oracle索引详解(二) --索引分类   Oracle 提供了大量索引选项.知道在给定条件下使用哪个选项对于一个程序的性能来说非常重要.一个错误的选择可能会引发死锁,并导致数据库性能急剧下降或进程 ...

  7. Oracle内存详解之 Library cache 库缓冲

    Oracle内存详解之 Library cache 库缓冲 2017年11月09日 11:38:39 阅读数:410更多 个人分类: 体系结构 Library cache是Shared pool的一部 ...

  8. Oracle date 详解

    oracle 数据类型详解---日期型 oracle数据类型看起来非常简单,但用起来会发现有许多知识点,本文是我对ORACLE日期数据类型的一些整理,都是开发入门资料,与大家分享:注:由于INTERV ...

  9. (转)oracle视图详解

    Oracle视图详解   一. 视图的定义 视图(view),也称虚表, 不占用物理空间,这个也是相对概念,因为视图本身的定义语句还是要存储在数据字典里的.视图只有逻辑定义.每次使用的时候,只是重新执 ...

  10. WebService核心文件【server-config.wsdd】详解及调用示例

    WebService核心文件[server-config.wsdd]详解及调用示例 作者:Vashon 一.准备工作 导入需要的jar包: 二.配置web.xml 在web工程的web.xml中添加如 ...

随机推荐

  1. [转帖]命令行非明文密码连接 TiDB

    https://tidb.net/blog/6794a34b#%E6%96%B9%E5%BC%8F%E4%B8%80%EF%BC%9A%E5%91%BD%E4%BB%A4%E8%A1%8C%E8%BE ...

  2. [转帖]9.1 TiDB HTAP 的特点

    HTAP 是 Hybrid Transactional / Analytical Processing 的缩写.这个词汇在 2014 年由 Gartner 提出.传统意义上,数据库往往专为交易或者分析 ...

  3. [转帖]TiDB BR 备份至 MinIO S3 实战

    https://tidb.net/blog/3a31d41d#3.%E9%83%A8%E7%BD%B2%20MinIO%20S3%20%E5%8F%8A%E5%A4%87%E4%BB%BD%E6%81 ...

  4. [转帖]redis进程绑定指定的CPU核

    文章系转载,便于分类和归纳,源文地址:https://blog.csdn.net/youlinhuanyan/article/details/99671878 1)查看某服务的pid $ ps -au ...

  5. [转帖]gcc与makefile常用操作(绝对常用,也绝对够用)

    makefile与gcc常用操作 一.温故知新 1.可执行程序的生成过程 2.gcc的常用操作 二.make操作 三.编写Makefile文件时常用操作 注意:在Makefile文件中 空格和缩进是完 ...

  6. [转帖]Linux开发环境——SCL软件集

    一.SCL简介 1.SCL简介 SCL(Software Collections)是一个CentOS/RHEL Linux平台的软件多版本共存解决方案,为RHEL/CentOS  Linux用户提供一 ...

  7. [转帖]线上Java 高CPU占用、高内存占用排查思路

    一.前言 处理过线上问题的同学基本上都会遇到系统突然运行缓慢,CPU 100%,以及Full GC次数过多的问题.当然,这些问题的最终导致的直观现象就是系统运行缓慢,并且有大量的报警.本文主要针对系统 ...

  8. jmaps

    #!/bin/bash # # jmaps - creates java /tmp/perf-PID.map symbol maps for all java processes. # # This ...

  9. js赋值的两种方式

    第一种 let obj=[ { value:undefined } ] obj[0].value.value='zahngsan' obj[0].value.label='张三' 机智的小伙伴,可能已 ...

  10. ES6 Array.fiill()的用法

    简单使用 // arr.fill(value, start, end) // value填充的值 // start填充的起始位置包含 // end填充的结束值,不包含,如果省略这个参数,表示从起始位置 ...