Oracle中分析函数
1.
- row_number() over(PARTITION BY ...ORDER BY...)--在求第一名成绩的时候,不能用,因为如果有两个并列第一,只会返回一个,ROW_NUMBER 为每一组的行按顺序生成一个连续序号
- rank() over(PARTITION BY...ORDER BY ...)--跳跃排序,有两个第二名时接下来就是第四名,RANK()也为每一组的行生成一个序号,与ROW_NUMBER()不同的是如果按照ORDER BY的排序,如果有相同的值会生成相同的序号,并且接下来的序号是不连序的。例如两个相同的行生成序号3,那么接下来会生成序号5。
- dense_rank() over(PARTITION BY...ORDER BY ...) --连续排序,有两个第二名时仍然跟着第三名
- Count() over(PARTITION BY...ORDER BY ...)
- Max() over(PARTITION BY...ORDER BY ...)
- Min() over(PARTITION BY...ORDER BY ...)
- Sum() over(PARTITION BY...ORDER BY ...)
- AVG() over(PARTITION BY...ORDER BY ...)
- first_value() over(PARTITION BY...ORDER BY ...)
- last_value() over(PARTITION BY...ORDER BY ...)
- lag() over(PARTITION BY...ORDER BY ...)
- lead() over(PARTITION BY...ORDER BY ...)
- SQL> desc criss_sales;
- Name Type Nullable Default Comments
- ---------- ----------- -------- ------- --------
- DEPT_ID VARCHAR2(6) Y
- SALE_DATE DATE Y
- GOODS_TYPE VARCHAR2(4) Y
- SALE_CNT NUMBER(10) Y
- SQL> select * from criss_sales order by dept_id,sale_date desc;
- DEPT_ID SALE_DATE GOODS_TYPE SALE_CNT
- ------- ----------- ---------- -----------
- D01 2014/5/4 G02 80
- D01 2014/4/30 G03 800
- D01 2014/4/8 G01 200
- D01 2014/3/4 G00 700
- D02 2014/5/2 G03 900
- D02 2014/4/27 G01 300
- D02 2014/4/8 G02 100
- D02 2014/3/6 G00 500
一.全统计
最常用的全统计就是均值或求和,有时会要求同一行记录包含不同范围的全统计。
例:
为数据集统计部门销售总和,全公司销售总和,部门销售均值,全公司销售均值
- select
- dept_id
- ,sale_date
- ,goods_type
- ,sale_cnt
- ,sum(sale_cnt) over (partition by dept_id) dept_total
- ,sum(sale_cnt) over() cmp_total
- ,avg(sale_cnt) over (partition by dept_id) avg_dept
- ,avg(sale_cnt) over() avg_cmp
- from criss_sales;
二.滚动统计
滚动统计最常用的一个场景之一是累计。
例:
计算部门和全公司的销售树量累计值。
- select
- dept_id
- ,sale_date
- ,goods_type
- ,sale_cnt
- ,sum(sale_cnt) over(partition by dept_id order by dept_id,sale_date rows between unbounded preceding and current row) dept_cur_total
- ,sum(sale_cnt) over(order by dept_id,sale_date rows between unbounded preceding and current row) cmp_cur_total
- from criss_sales;
三.范围统计
有时候,我们往往关注一定范围内的数据,例如时间范围(一周内的数据),记录范围(前三条记录到当前记录)。
例:按日期排序,求相相邻三次销售记录的和
- select
- dept_id
- ,sale_date
- ,goods_type
- ,sale_cnt
- ,sum(sale_cnt) over(order by sale_date rows between 1 preceding and 1 following) CON_1_CNT
- from criss_sales;
时间范围例子:
按日期排序,求当前记录日期前三天到后天三的销售数量和
- select
- dept_id
- ,sale_date
- ,goods_type
- ,sale_cnt
- ,sum(sale_cnt) over(order by sale_date range between interval '' day preceding and interval '' day following) sum_7_days
- from criss_sales;
四.(相邻)行比较
其实用over(order by xxx rows between 1 preceding and 0 following)也能实现相邻行的对比。
但是,Oracle提供更方便的两个函数
lead() 与后面某一行对比
lag() 与前面一行对比
按时间排序,显示当前记录的数量以及前后相邻记录的销售数量
- select
- dept_id
- ,sale_date
- ,goods_type
- ,sale_cnt
- ,lag(sale_cnt,1) over(order by sale_date) lag_1
- ,lead(sale_cnt,1) over(order by sale_date) lead_1
- ,first_value(sale_cnt) over(order by sale_date rows between 1 preceding and 0 following)
- from criss_sales;
最后一列是利用over(order by xxx rows between 1 preceding and 0 following)与 lag做对比。同样可以得到我们希望看到的结果。
Oracle中分析函数的更多相关文章
- 分组函数group by和Oracle中分析函数partition by的用法以及区别
1.分组函数group by和Oracle中分析函数partition by的用法以及区别 2.开窗函数.
- Oracle 中的分析函数
Oracle常用分析函数介绍(排名函数+窗口函数) 2014年11月30日 ⁄ 数据库 ⁄ 共 3903字 ⁄ 暂无评论 ⁄ 阅读 7,772 次 评级函数 常见评级函数如下: RANK():返回数据 ...
- ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法
ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组, ...
- Oracle中的sql操作符 和分析函数
Oracle中的操作符算术操作符:无论是在sqlserver,或者是java中,每种语言它都有算术操作符,大同小异. Oracle中算术操作符(+)(-)(*)(/) 值得注意的是:/ 在oracle ...
- 问题:oracle ROW_NUMBER()over;结果: ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法
ORACLE 中的 ROW_NUMBER() OVER() 分析函数的用法 ROW_NUMBER() OVER(partition by col1 order by col2) 表示根据col1分组, ...
- Oracle 中的Top写法
由于Oracle不支持select top 语句,所以在Oracle中经常是用order by 跟rownum的组合来实现select top n的查询.简单地说,实现方法如下所示:select 列名 ...
- oracle中110个常用函数介绍
1. ASCII 返回与指定的字符对应的十进制数; SQL> select ascii(A) A,ascii(a) a,ascii(0) zero,ascii( ) space from dua ...
- Oracle 10gR2分析函数
Oracle 10gR2分析函数汇总 (Translated By caizhuoyi 2008‐9‐19) 说明: 1. 原文中底色为黄的部分翻译存在商榷之处,请大家踊跃提意见: 2. 原文中淡 ...
- Oracle中的NULL、’’(空字符串)以及’_’(空格)
本文首发于 http://youngzy.com/ 在Oracle中使用 null,''(空字符串),'_'(空格)时,有没有遇到问题?产生疑惑? null和’’(空字符串)是一个意思 注: 为了便于 ...
随机推荐
- IIS+上传4G文件
最近在学习百度的开源上传组件WebUploader,写了一些示例以记录.WebUploader的缺点是没有一个比较好的现成的界面,这个界面需要自己去实现.自由度高了一些. WebUploader是由B ...
- js+分布上传大文件
文件夹上传:从前端到后端 文件上传是 Web 开发肯定会碰到的问题,而文件夹上传则更加难缠.网上关于文件夹上传的资料多集中在前端,缺少对于后端的关注,然后讲某个后端框架文件上传的文章又不会涉及文件夹. ...
- 关于java代理(静态代理和动态代理)
参考文章:http://kuangbaoxu.iteye.com/blog/193240
- fileReader对象读取txt文件乱码问题 以及如何获取文件的url路径(绝对路径)
<input type="file" @change="aaa($event)"> <div id="hi">< ...
- 第06课:作用域、JS预解析机制
从字面上理解----域就是空间.范围.区域,作用就是读.写,所以作用域我们可以简单理解为:在什么样空间或者范围内对数据进行什么样的读或写操作. 看一下代码 alert(a); // 为什么是undef ...
- Vue_(组件)自定义指令
Vue.js自定义指令 传送门 自定义指令:除了内置指令,Vue也允许用户自定义指令 注册指令:通过全局API Vue.directive可以注册自定义指令 自定义指令的钩子函数参数:自定义指令的钩子 ...
- CSP2019游(AFO?)记
Day 1 不知道为啥一看到\(T1\)就想到\(longlong\)可能存不下,试了下果然. \(T2\)想了半个小时胡出个\(O(n)\)算法,但是假了.冷静了一下,做了前缀和之后,合法的子区间\ ...
- 成员函数定义后面加 const 的意义
我们定义的类的成员函数中,常常有一些成员函数不改变类的数据成员,也就是说,这些函数是"只读"函数,而有一些函数要修改类数据成员的值.如果把不改变数据成员的函数都加上const关键字 ...
- ARTS打卡计划第一周
Algorithms: https://leetcode-cn.com/problems/two-sum/ Review: https://www.infoq.cn/article/EafgGJEtq ...
- Java集成POI进行Excele的导入导出,以及报错: java.lang.AbstractMethodError..........
报错信息如下 java.lang.AbstractMethodError: org.apache.poi.xssf.usermodel.XSSFCell.setCellType(Lorg/apache ...