Oracle分析函数
文章目录
- 一、背景
- 二、创建测试数据
- 2.1 测试数据创建脚本
- 2.2 测试数据详情
- 三、相关需求及SQL示例
- 3.1 统计当季总处置金额
- 3.2 统计当季初至当月累计处置金额
- 3.3 统计每月与上月的变动额
- 四、其它参考资料
- 五、我的学习心得
一、背景
分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。
在本文,我会通过几个小需求,介绍一些分析函数的用法,以及我的一些学习心得。对于函数更详尽的用法,可参考本文第四点。
二、创建测试数据
2.1 测试数据创建脚本
-- MONEY_PER_MONTH 是100到200之间的随机整数
CREATE TABLE TMP AS
SELECT RPT_DT,MONEY_PER_MONTH,TO_CHAR(TO_DATE(RPT_DT,'YYYYMMDD'),'Q') QUARTER
FROM
(SELECT '2019'||LPAD(LEVEL,2,'0')||'01' RPT_DT FROM DUAL CONNECT BY LEVEL <=12) TMP1,
(SELECT TRUNC(DBMS_RANDOM.VALUE(100,200)) MONEY_PER_MONTH FROM DUAL) TMP2;
2.2 测试数据详情
RPT_DT | MONEY_PER_MONTH | QUARTER |
---|---|---|
20190101 | 151 | 1 |
20190201 | 180 | 1 |
20190301 | 142 | 1 |
20190401 | 101 | 2 |
20190501 | 160 | 2 |
20190601 | 148 | 2 |
20190701 | 109 | 3 |
20190801 | 144 | 3 |
20190901 | 164 | 3 |
20191001 | 195 | 4 |
20191101 | 126 | 4 |
20191201 | 139 | 4 |
三、相关需求及SQL示例
3.1 统计当季总处置金额
-- SQL1:该SQL第3列表达的是当季总处置金额
SELECT RPT_DT,QUARTER,
SUM(MONEY_PER_MONTH) OVER(PARTITION BY QUARTER ORDER BY RPT_DT ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) "本季累计处置金额"
FROM TMP;
SQL1的数据结果:
RPT_DT | 本季累计处置金额 | QUARTER |
---|---|---|
20190101 | 473 | 1 |
20190201 | 473 | 1 |
20190301 | 473 | 1 |
20190401 | 409 | 2 |
20190501 | 409 | 2 |
20190601 | 409 | 2 |
20190701 | 417 | 3 |
20190801 | 417 | 3 |
20190901 | 417 | 3 |
20191001 | 460 | 4 |
20191101 | 460 | 4 |
20191201 | 460 | 4 |
3.2 统计当季初至当月累计处置金额
-- SQL2:该SQL第3列表达的是当季季初(含)至当月(含)累计处置金额
SELECT RPT_DT,QUARTER,
SUM(MONEY_PER_MONTH) OVER(PARTITION BY QUARTER ORDER BY RPT_DT ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) "本季初至当月累计处置金额"
FROM TMP;
SQL2的数据结果:
RPT_DT | 本季初至当月累计处置金额 | QUARTER |
---|---|---|
20190101 | 151 | 1 |
20190201 | 331 | 1 |
20190301 | 473 | 1 |
20190401 | 101 | 2 |
20190501 | 261 | 2 |
20190601 | 409 | 2 |
20190701 | 109 | 3 |
20190801 | 253 | 3 |
20190901 | 417 | 3 |
20191001 | 195 | 4 |
20191101 | 321 | 4 |
20191201 | 460 | 4 |
3.3 统计每月与上月的变动额
-- SQL3:统计每月相较上月的变动额
SELECT RPT_DT,QUARTER,
MONEY_PER_MONTH- LAG(MONEY_PER_MONTH) OVER(ORDER BY RPT_DT) "当月相较上月变动额"
FROM TMP;
SQL3的数据结果:
RPT_DT | 当月相较上月变动额 | QUARTER |
---|---|---|
20190101 | 1 | |
20190201 | 29 | 1 |
20190301 | -38 | 1 |
20190401 | -41 | 2 |
20190501 | 59 | 2 |
20190601 | -12 | 2 |
20190701 | -39 | 3 |
20190801 | 35 | 3 |
20190901 | 20 | 3 |
20191001 | 31 | 4 |
20191101 | -69 | 4 |
20191201 | 13 | 4 |
四、其它参考资料
关于Oracle分析函数的更多知识点,大家可以上网搜索一下,比如可参考这篇文章
https://blog.csdn.net/cc_0101/article/details/80884076
https://www.cnblogs.com/cjm123/p/8033892.html
五、我的学习心得
所有分析函数,完成掌握,实际上也没有必要,很多时候我们都用20%的技术解决80%的问题。我们得**先对分析函数有一个整体的概念,比如它都有些什么函数,能解决哪些数据需求,工作中常见数据库产品对分析函数的支持程度如何。**另外,多思考,如果不依赖数据库,面对类似的数据需求,用Java、Python、Excel有什么样的解决方案。
其它我认为要掌握的知识有:dense_rank()、rank() over()、row_number() over() 、lag() over()、lead() over()。
创建测试数据的方法,可以学习一下。
上文SQL3的数据需求,附上Python的pandas解决方案,用diff()这个好轮子。
import pandas as pd
df=pd.DataFrame({'month':[1,2,3,4,5,6],'money':[151,180,142,101,160,148]})
print(df)
print(df.diff()) #df.diff() = df – df.shift()
Oracle分析函数相关推荐
- Oracle分析函数五——统计分析函数
Oracle 分析函数--统计分析函数 方差和标准差: 样本中各数据与样本平均数的差的平方和的平均数叫做样本方差:样本方差的算术平方根叫做样本标准差.样本方差和样本标准差都是衡量一个样本波动大 ...
- oracle 四分位函数,Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
Oracle 分析函数--函数RANK,DENSE_RANK,FIRST,LAST- RANK 功能描述:根据 ORDER BY 子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置.组内 ...
- 【分析函数】Oracle分析函数之LAG和LEAD
[分析函数]Oracle分析函数之LAG和LEAD Lag和Lead函数可以在一次查询中取出同一字段的前N行的数据和后N行的值.这种操作可以使用对相同表的表连接来实现,不过使用LAG和LEAD有更高的 ...
- oracle 数据分析函数,ORACLE分析函数(一)
ORACLE分析函数(1) 分析函数式ORACLE提供的用来进行数据统计的强有力工具,与我们常用的聚合函数具有一些相似性,但又完全不同.聚合函数,首先会将数据进行分组,然后对每一组数据进行运算,如求和 ...
- Oracle分析函数巧妙使用
在 Oracle中使用Sql必须弄懂分析函数 Oracle开发专题之:分析函数(OVER) 1 Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 6 Or ...
- Oracle 分析函数--Row_Number()
row_number() over ([partition by col1] order by col2) ) as 别名 表示根据col1分组,在分组内部根据 col2排序 而这个"别名& ...
- Oracle分析函数——函数列表
--------------聚合函数 SUM :该函数计算组中表达式的累积和 MIN :在一个组中的数据窗口中查找表达式的最小值 MAX :在一个组中的数据窗口中查找表达式的最大值 AVG :用于计算 ...
- Oracle分析函数三——SUM,AVG,MIN,MAX,COUNT
Oracle 分析函数--SUM,AVG,MIN,MAX,COUNT SUM 功能描述:该函数计算组中表达式的累积和. SAMPLE :下例计算同一经理下员工的薪水累积值 MIN 功能描述:在一个组中 ...
- oracle 分析函数、GROUPING函数
分析函数 over(Partition by...) 一个超级牛皮的ORACLE特有函数.天天都用ORACLE,用了快2年了.最近才接触到这个功能强大而灵活的函数.真实惭愧啊!oracle的分析函数o ...
- Oracle分析函数四——函数RANK,DENSE_RANK,FIRST,LAST…
Oracle分析函数--函数RANK,DENSE_RANK,FIRST,LAST- RANK 功能描述:根据ORDER BY子句中表达式的值,从查询返回的每一行,计算它们与其它行的相对位置.组内的数据 ...
最新文章
- 开源 免费 java CMS - FreeCMS1.5-信息管理
- 下载python的步骤ios_下载及安装Python详细步骤
- 百度2014校园招聘笔试题(成都站,软件研发岗)——2014.09.21
- package.json
- 深度学习之基于Tensorflow2.0实现ResNet50网络
- mysql数据库密码错误_MySQL数据库经典错误六 数据库密码忘记的问题
- 产品经理的职责(转)
- 力扣-61 旋转链表
- CSS 相邻选择器(七)
- FineReport10 决策报表常用javascript脚本
- 三星手机性能测试软件,5部手机性能测试:红米垫底三星倒数第三 第一当之无愧...
- baiduRanking多站点批量百度排名查询
- 深度解析论文 基于 LSTM 的 POI 个性化推荐框架
- php购物车登录用cookie,php利用cookies实现购物车的方法_PHP
- Exchange Server 2013 运维系列——恢复已删除或禁用的邮箱
- 免费的C++库—备用记录
- 如何优雅的处理错误逻辑
- vue双向绑定问题,修改数据时改变了原数据
- C型钢市场前景分析及行业研究报告
- 【pygame游戏开发】这几个经典游戏,勾起了少年的快乐