Orcale分析函数OVER(PARTITION BY... ORDER BY...)的讲解
顾名思义,PARTITION 中文是分割的意思,ORDER 是排序的意思,所以翻译一下就是先把一组数据按照制定的字段进行分割成各种组,然后组内按照某个字段排序。
以实际案例来说明这个函数的使用,
首先,我们先看一组普通排序的数据:
然后对其进行新加一个伪劣ROWNUM,看看数据原本的顺序:
OVER(ORDER BY ...)的意思是以按照某个字段排序,所以和直接对表的order by效果是一样的:
这里就显示了OVER(ORDER BY ...)的第一个功能,就是对新查询得到的数据进行重新编号,即RNO的值,由于这里没有PARTITION BY...,所以可以比作整个列就是一个大块,然后对大块的内容进行排序,这个时候再加上PARTITION BY...,查询结果:
它会按照制定的字段,把相同值的排在一起,分为一个块,也就是分组,然后组内排序编号,这样你就可以取不同组内的任意第几个值,类似于TOP-N的分析。
在这里over之前使用的函数是ROW_NUMBER(),就是对数据的编号。
与OVER(PARTITION BY... ORDER BY...)匹配使用的函数
row_number() over()、rank() over()和dense_rank() over()
在上面的例子里,使用ROW_NUMBER()可以对数据编号,但是有一个问题,例子中的MI_ID是不可以重复的,如果在可以重复的情况下,就有并列的情况,这样就无法取出并列的数据,只能取单一排序的数据。所以这里可以换成 rank() over()和dense_rank() over()来进行编号:(rank() over()和dense_rank() over()的区别如图)
sum() over(),first_value() over()和last_value() over()的使用
sum() over()分组求和
first_value() over()求分组第一条
last_value() over()求分组最后一条
其中用row_number() over()取编号第一条的也可以实现first_value() over()的效果
SELECT DISTINCT *
FROM (SELECT T1.MI_ID,
T3.I_IDENTITY_CARD,
SUM(NVL(T2.IS_VISHEARTPROMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) PRO_NUM,
SUM(NVL(T2.IS_VISHEARTEXPMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) EXP_NUM,
SUM(NVL(T2.IS_VISHEARTPOLMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) POL_NUM,
T1.CREATE_TIME,
FIRST_VALUE(T2.CREATE_DATE) OVER(PARTITION BY T3.I_IDENTITY_CARD ORDER BY T2.CREATE_DATE DESC) FIRST_CREATE_DATE
FROM T_ZZ_PETITIONERS T1
LEFT JOIN T_ZZ_VISIT_RECORD T2
ON T1.CI_RS_ID = T2.CI_RS_ID
AND T2.STATUS != ''
LEFT JOIN T_DC_CI_RS_TOP T3
ON T1.CI_RS_ID = T3.CI_RS_ID
AND T3.STATUS = ''
WHERE T1.IS_ADD_HEARTPROTECT = ''
AND T1.STATUS = '') C
ORDER BY C.CREATE_TIME DESC
SELECT *
FROM (SELECT T1.MI_ID,
T3.I_IDENTITY_CARD,
SUM(NVL(T2.IS_VISHEARTPROMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) PRO_NUM,
SUM(NVL(T2.IS_VISHEARTEXPMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) EXP_NUM,
SUM(NVL(T2.IS_VISHEARTPOLMEMBER, 0)) OVER(PARTITION BY T3.I_IDENTITY_CARD) POL_NUM,
T1.CREATE_TIME,
ROW_NUMBER() OVER(PARTITION BY T3.I_IDENTITY_CARD ORDER BY T2.CREATE_DATE DESC) RNO
FROM T_ZZ_PETITIONERS T1
LEFT JOIN T_ZZ_VISIT_RECORD T2
ON T1.CI_RS_ID = T2.CI_RS_ID
AND T2.STATUS != ''
LEFT JOIN T_DC_CI_RS_TOP T3
ON T1.CI_RS_ID = T3.CI_RS_ID
LEFT JOIN T_DC_GRID T4
ON T1.REGION_CODE = T4.INFO_ORG_CODE
WHERE T1.IS_ADD_HEARTPROTECT = ''
AND T1.STATUS = ''
AND T3.STATUS = ''
AND T4.STATUS = '') C
WHERE C.RNO = 1
ORDER BY C.CREATE_TIME DESC
ignore nulls:过滤掉空值
常用的分析函数如下所列:
row_number() over(partition by ... order by ...)
rank() over(partition by ... order by ...)
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 ...)
本文转自:https://blog.csdn.net/east_mrchiu/article/details/70183428
Orcale分析函数OVER(PARTITION BY... ORDER BY...)的讲解的更多相关文章
- oracle 之分析函数 over (partition by ...order by ...)
一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行. 1.分析函数和聚合函数的 ...
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数 (转)
http://zonghl8006.blog.163.com/blog/static/4528311520083995931317/ over(Partition by...) 一个超级牛皮的ORAC ...
- 超级牛皮的oracle的分析函数over(Partition by...) 及开窗函数
over(Partition by...) 一个超级牛皮的ORACLE特有函数. 天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊! oracle的分析函数over ...
- oracle的分析函数over(Partition by...) 及开窗函数
over(Partition by...) 一个超级牛皮的ORACLE特有函数. oracle的分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函 ...
- row_number() over (partition by....order by...)用法 分组排序
row_number() over (partition by....order by...)用法 分组排序 row_number() OVER (PARTITION BY COL1 ORDER BY ...
- oracle row_number() over(partition by .. order by ..)和rank() over(partition by .. order by ..) 和dense_rank() over(partition by .. order by ..)的相似点与区别
新建一个测试表 create table dim_ia_test2(device_number varchar2(20),desc2 varchar2(20)) 插入数据后得到: 一.oracle r ...
- SQL Fundamentals: 子查询 || 分析函数(PARTITION BY,ORDER BY, WINDOWING)
SQL Fundamentals || Oracle SQL语言 子查询(基础) 1.认识子查询 2.WHERE子句中使用子查询 3.在HAVING子句中使用子查询 4.在FROM子句中使用子查询 5 ...
- Oracle分析函数-rank() over(partition by...order by...)
select *from ( SELECT t.s#,---学号 t.c#,---课程号 T.SCCORE, ---成绩 RANK() OVER(PARTITION BY t.c# ORDER BY ...
- oracle常用分析函数 over(partition by xxx order by xxx)
--over order by 连续累加的意思,把by后面相同的字段,一个组组累加起来SELECT id_,name_,proc_def_id_, count(*) over(order by nam ...
随机推荐
- 树莓派进阶之路 (026) - 基于 Samba 实现 NAS 系统
摆弄了几天Raspberry Pi,在搞定了无线网络.FTP服务之后,打算更进一步,通过Samba实现NAS系统与PC共享文件.需要安装的软件:sudo apt-get install samba s ...
- 有关于malloc申请内存和free内存释放
malloc工作机制: malloc函数的实质体现在,它有一个将可用的内存块连接为一个长长的列表的所谓空闲链表(堆内存).调用malloc函数时,它沿连接表寻找一个大到足以满足用户请求所需要的内存块. ...
- 【Servlet】Java Serlvet Listener 监听器
Listener监听器 Servlet规范中定义的一种特殊的组件,用来监听Servlet容器产生的事件并进行相应的处理 容器产生的事件分类 - 生命周期相关的事件 - 设置和删除Attribute数据 ...
- AndroidStudio升级到2.3版本无法编译的解决方法
上周五as提示更新,于是为了体验新功能还在编码过程中就迫不及待的点击了更新,公司网很快,十几分钟就下载好,然后一重启就懵逼了,提示是否更改依赖版本到2.3以及升级gradle到3.3,点了确定就一直在 ...
- Swift 类
1.类概念 类是一种抽象的概念,它实际上并不存在于现实中的时间和空间里. 在定义一个类时,我们就会在类中定义该类事物的特性和行为,从术语上讲,特性叫类的属性,行为叫类的方法. 类是一个静态的概念,类本 ...
- 使用 Apache Commons CSV 读写 CSV 文件
有时候,我们需要读写 CSV 文件,在这里给大家分享Apache Commons CSV,读写 CSV 文件非常方便. 具体官方文档请访问Apache Commons CSV. 官方文档已经写得很详细 ...
- android studio(AS) Duplicate files copied in APK META-INF/NOTICE.txt
File 1: /home/slava/.gradle/caches/modules-2/files-2.1/org.apache.httpcomponents/httpmime/4.3.1/f789 ...
- struts2(六) 文件上传和下载
前面对文件下载提过一点点,这里正好要讲文件上传,就放在一起在说一遍. --WH 一.单文件上传 在没学struts2之前,我们要写文件上传,非常麻烦,需要手动一步步去获取表单中的各种属性,然后在进行相 ...
- iOS 基础-----关于UIView 的 frame 与 bounds
首先,对于frame 大家都很熟悉,是当前view ,相对于其父视图view 的坐标,例如: UIView *view1 = [[UIView alloc] initWithFrame:CGRectM ...
- Adventures in deep learning
转:https://github.com/GKalliatakis/Adventures-in-deep-learning Adventures in deep learning State-of-t ...