1.

  1. row_number() over(PARTITION BY ...ORDER BY...)--在求第一名成绩的时候,不能用,因为如果有两个并列第一,只会返回一个,ROW_NUMBER 为每一组的行按顺序生成一个连续序号
  2. rank() over(PARTITION BY...ORDER BY ...)--跳跃排序,有两个第二名时接下来就是第四名,RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5
  3. dense_rank() over(PARTITION BY...ORDER BY ...) --连续排序,有两个第二名时仍然跟着第三名
  4. Count() over(PARTITION BY...ORDER BY ...)
  5. Max() over(PARTITION BY...ORDER BY ...)
  6. Min() over(PARTITION BY...ORDER BY ...)
  7. Sum() over(PARTITION BY...ORDER BY ...)
  8. AVG() over(PARTITION BY...ORDER BY ...)
  9. first_value() over(PARTITION BY...ORDER BY ...)
  10. last_value() over(PARTITION BY...ORDER BY ...)
  11. lag() over(PARTITION BY...ORDER BY ...)
  12. lead() over(PARTITION BY...ORDER BY ...)
  1. SQL> desc criss_sales;
  2. Name Type Nullable Default Comments
  3. ---------- ----------- -------- ------- --------
  4. DEPT_ID VARCHAR2(6) Y
  5. SALE_DATE DATE Y
  6. GOODS_TYPE VARCHAR2(4) Y
  7. SALE_CNT NUMBER(10) Y
  8.  
  9. SQL> select * from criss_sales order by dept_id,sale_date desc;
  10.  
  11. DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT
  12. ------- ----------- ---------- -----------
  13. D01 2014/5/4 G02 80
  14. D01 2014/4/30 G03 800
  15. D01 2014/4/8 G01 200
  16. D01 2014/3/4 G00 700
  17. D02 2014/5/2 G03 900
  18. D02 2014/4/27 G01 300
  19. D02 2014/4/8 G02 100
  20. D02 2014/3/6 G00 500

一.全统计
最常用的全统计就是均值或求和,有时会要求同一行记录包含不同范围的全统计。
例:
为数据集统计部门销售总和,全公司销售总和,部门销售均值,全公司销售均值

  1. select
  2. dept_id
  3. ,sale_date
  4. ,goods_type
  5. ,sale_cnt
  6. ,sum(sale_cnt) over (partition by dept_id) dept_total
  7. ,sum(sale_cnt) over() cmp_total
  8. ,avg(sale_cnt) over (partition by dept_id) avg_dept
  9. ,avg(sale_cnt) over() avg_cmp
  10. from criss_sales;

二.滚动统计
滚动统计最常用的一个场景之一是累计。

例:
计算部门和全公司的销售树量累计值。

  1. select
  2. dept_id
  3. ,sale_date
  4. ,goods_type
  5. ,sale_cnt
  6. ,sum(sale_cnt) over(partition by dept_id order by dept_id,sale_date rows between unbounded preceding and current row) dept_cur_total
  7. ,sum(sale_cnt) over(order by dept_id,sale_date rows between unbounded preceding and current row) cmp_cur_total
  8. from criss_sales;

三.范围统计
有时候,我们往往关注一定范围内的数据,例如时间范围(一周内的数据),记录范围(前三条记录到当前记录)。

例:按日期排序,求相相邻三次销售记录的和

  1. select
  2. dept_id
  3. ,sale_date
  4. ,goods_type
  5. ,sale_cnt
  6. ,sum(sale_cnt) over(order by sale_date rows between 1 preceding and 1 following) CON_1_CNT
  7. from criss_sales;

时间范围例子:
按日期排序,求当前记录日期前三天到后天三的销售数量和

  1. select
  2. dept_id
  3. ,sale_date
  4. ,goods_type
  5. ,sale_cnt
  6. ,sum(sale_cnt) over(order by sale_date range between interval '' day preceding and interval '' day following) sum_7_days
  7. from criss_sales;

四.(相邻)行比较
其实用over(order by xxx rows between 1 preceding and 0 following)也能实现相邻行的对比。
但是,Oracle提供更方便的两个函数 
lead() 与后面某一行对比
lag()  与前面一行对比

按时间排序,显示当前记录的数量以及前后相邻记录的销售数量

  1. select
  2. dept_id
  3. ,sale_date
  4. ,goods_type
  5. ,sale_cnt
  6. ,lag(sale_cnt,1) over(order by sale_date) lag_1
  7. ,lead(sale_cnt,1) over(order by sale_date) lead_1
  8. ,first_value(sale_cnt) over(order by sale_date rows between 1 preceding and 0 following)
  9. from criss_sales;

最后一列是利用over(order by xxx rows between 1 preceding and 0 following)与 lag做对比。同样可以得到我们希望看到的结果。

Oracle中分析函数的更多相关文章

  1. 分组函数group by和Oracle中分析函数partition by的用法以及区别

    1.分组函数group by和Oracle中分析函数partition by的用法以及区别 2.开窗函数.

  2. Oracle 中的分析函数

    Oracle常用分析函数介绍(排名函数+窗口函数) 2014年11月30日 ⁄ 数据库 ⁄ 共 3903字 ⁄ 暂无评论 ⁄ 阅读 7,772 次 评级函数 常见评级函数如下: RANK():返回数据 ...

  3. ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

    ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组, ...

  4. Oracle中的sql操作符 和分析函数

    Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...

  5. 问题:oracle ROW_NUMBER()over;结果: ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法

    ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组, ...

  6. Oracle 中的Top写法

    由于Oracle不支持select top 语句,所以在Oracle中经常是用order by 跟rownum的组合来实现select top n的查询.简单地说,实现方法如下所示:select 列名 ...

  7. oracle中110个常用函数介绍

    1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...

  8. Oracle 10gR2分析函数

    Oracle 10gR2分析函数汇总 (Translated By caizhuoyi 2008‐9‐19) 说明:  1. 原文中底色为黄的部分翻译存在商榷之处,请大家踊跃提意见:  2. 原文中淡 ...

  9. Oracle中的NULL、’’(空字符串)以及’_’(空格)

    本文首发于 http://youngzy.com/ 在Oracle中使用 null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? null和’’(空字符串)是一个意思 注: 为了便于 ...

随机推荐

  1. IIS+上传4G文件

    最近在学习百度的开源上传组件WebUploader,写了一些示例以记录.WebUploader的缺点是没有一个比较好的现成的界面,这个界面需要自己去实现.自由度高了一些. WebUploader是由B ...

  2. js+分布上传大文件

    文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...

  3. 关于java代理(静态代理和动态代理)

    参考文章:http://kuangbaoxu.iteye.com/blog/193240

  4. fileReader对象读取txt文件乱码问题 以及如何获取文件的url路径(绝对路径)

    <input type="file" @change="aaa($event)"> <div id="hi">< ...

  5. 第06课:作用域、JS预解析机制

    从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undef ...

  6. Vue_(组件)自定义指令

    Vue.js自定义指令 传送门 自定义指令:除了内置指令,Vue也允许用户自定义指令 注册指令:通过全局API Vue.directive可以注册自定义指令 自定义指令的钩子函数参数:自定义指令的钩子 ...

  7. CSP2019游(AFO?)记

    Day 1 不知道为啥一看到\(T1\)就想到\(longlong\)可能存不下,试了下果然. \(T2\)想了半个小时胡出个\(O(n)\)算法,但是假了.冷静了一下,做了前缀和之后,合法的子区间\ ...

  8. 成员函数定义后面加 const 的意义

    我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值.如果把不改变数据成员的函数都加上const关键字 ...

  9. ARTS打卡计划第一周

    Algorithms: https://leetcode-cn.com/problems/two-sum/ Review: https://www.infoq.cn/article/EafgGJEtq ...

  10. Java集成POI进行Excele的导入导出,以及报错: java.lang.AbstractMethodError..........

    报错信息如下 java.lang.AbstractMethodError: org.apache.poi.xssf.usermodel.XSSFCell.setCellType(Lorg/apache ...