从事大数据数仓相关工作几年,今天偶然回去复习了 一下oracle的sql分析函数(hive中有些区别,后续还会总结),发现之前总结的还是有不少精华部分,故作此记录,以提醒自己要温故而知新,方可进步,否则只会捡了芝麻,丢了西瓜。

闲话少续,先建表造一下数据

create table earnings -- 打工赚钱表
(  earnmonth varchar2(6), -- 打工月份  area varchar2(20), -- 打工地区  sno varchar2(10), -- 打工者编号  sname varchar2(20), -- 打工者姓名  times int, -- 本月打工次数  singleincome number(10,2), -- 每次赚多少钱  personincome number(10,2) -- 当月总收入
);
然后插入实验数据:
insert into earnings values('200912','北平','511601','大魁',11,30,11*30);
insert into earnings values('200912','北平','511602','大凯',8,25,8*25);
insert into earnings values('200912','北平','511603','小东',30,6.25,30*6.25);
insert into earnings values('200912','北平','511604','大亮',16,8.25,16*8.25);
insert into earnings values('200912','北平','511605','贱敬',30,11,30*11);
insert into earnings values('200912','金陵','511301','小玉',15,12.25,15*12.25);
insert into earnings values('200912','金陵','511302','小凡',27,16.67,27*16.67);
insert into earnings values('200912','金陵','511303','小妮',7,33.33,7*33.33);
insert into earnings values('200912','金陵','511304','小俐',0,18,0);
insert into earnings values('200912','金陵','511305','雪儿',11,9.88,11*9.88);
insert into earnings values('201001','北平','511601','大魁',0,30,0);
insert into earnings values('201001','北平','511602','大凯',14,25,14*25);
insert into earnings values('201001','北平','511603','小东',19,6.25,19*6.25);
insert into earnings values('201001','北平','511604','大亮',7,8.25,7*8.25);
insert into earnings values('201001','北平','511605','贱敬',21,11,21*11);
insert into earnings values('201001','金陵','511301','小玉',6,12.25,6*12.25);
insert into earnings values('201001','金陵','511302','小凡',17,16.67,17*16.67);
insert into earnings values('201001','金陵','511303','小妮',27,33.33,27*33.33);
insert into earnings values('201001','金陵','511304','小俐',16,18,16*18);
insert into earnings values('201001','金陵','511305','雪儿',11,9.88,11*9.88);
Commit;

(1)sum函数,统计总合
按照月份,统计每個地区的总收入

select earnmonth, area, sum(personincome)from earningsgroup by earnmonth, area;

查看结果如下:
(2)rollup函数
按照月份,地区统计收入

select earnmonth, area, sum(personincome)from earningsgroup by rollup(earnmonth, area);

查看结果如下:

(3)cube函数
按照月份,地区进行收入总汇总

select earnmonth, area, sum(personincome)from earningsgroup by cube(earnmonth, area)order by earnmonth, area nulls last;

结果如下:
小结:sum是统计求和的函数。
group by 是分组函数,按照earnmonth和area先后次序分组。
以上三例都是先按照earnmonth分组,在earnmonth内部再按area分组,并在area组内统计personincome总合。
group by 后面什么也不接就是直接分组。
group by 后面接 rollup 是在纯粹的 group by 分组上再加上对earnmonth的汇总统计。
group by 后面接 cube 是对earnmonth汇总统计基础上对area再统计。
另外那个 nulls last 是把空值放在最后。
(4)grouping函数
在以上例子中,是用rollup和cube函数都会对结果集产生null,这时候可用grouping函数来确认
该记录是由哪个字段得出来的
grouping函数用法,带一个参数,参数为字段名,结果是根据该字段得出来的就返回1,反之返回0
Sql代码

select decode(grouping(earnmonth), 1, '所有月份', earnmonth) 月份,decode(grouping(area), 1, '全部地区', area) 地区,sum(personincome) 总金额from earningsgroup by cube(earnmonth, area)order by earnmonth, area nulls last;

查看结果如下:
(5)rank() over开窗函数
按照月份、地区,求打工收入排序
Sql代码

select earnmonth 月份,area 地区,sname 打工者,personincome 收入,rank() over(partition by earnmonth, area order by personincome desc) 排名

from earnings;
查看结果:
(6)dense_rank() over开窗函数
按照月份、地区,求打工收入排序2
Sql代码

select earnmonth 月份,area 地区,sname 打工者,personincome 收入,dense_rank() over(partition by earnmonth, area order by personincome desc) 排名from earnings;

结果如下:
(7)row_number() over开窗函数
按照月份、地区,求打工收入排序3
Sql代码

select earnmonth 月份,area 地区,sname 打工者,personincome 收入,row_number() over(partition by earnmonth, area order by personincome desc) 排名from earnings;

结果如下:
通过(5)(6)(7)发现rank,dense_rank,row_number的区别:
结果集中如果出现两个相同的数据,那么rank会进行跳跃式的排名,
比如两个第二,那么没有第三接下来就是第四;
但是dense_rank不会跳跃式的排名,两个第二接下来还是第三;
row_number最牛,即使两个数据相同,排名也不一样。
(8)sum累计求和
根据月份、地区求出各个打工者收入总和,按照收入由少到多排序
Sql代码

select earnmonth 月份,area 地区,sname 打工者,sum(personincome) over(partition by earnmonth, area order by personincome) 总收入from earnings;

查看结果如下:
(9)max,min,avg和sum函数综合运用
按照月份和地区求打工收入最高值,最低值,平均值和总额
Sql代码

select distinct earnmonth 月份,area 地区,max(personincome) over(partition by earnmonth, area) 最高值,min(personincome) over(partition by earnmonth, area) 最低值,avg(personincome) over(partition by earnmonth, area) 平均值,sum(personincome) over(partition by earnmonth, area) 总额from earnings;

结果如下:
(10)lag和lead函数
求出每个打工者上个月和下个月有没有赚钱(personincome大于零即为赚钱)
Sql代码

select earnmonth 本月,sname 打工者,lag(decode(nvl(personincome, 0), 0, '没赚', '赚了'), 1, 0) over(partition by sname order by earnmonth) 上月,lead(decode(nvl(personincome, 0), 0, '没赚', '赚了'), 1, 0) over(partition by sname order by earnmonth) 下月from earnings;

说明:Lag和Lead函数可以在一次查询中取出某个字段的前N行和后N行的数据

语法如下:

lag(value_expression [,offset] [,default]) over ([query_partition_clase] order_by_clause);
lead(value_expression [,offset] [,default]) over ([query_partition_clase] order_by_clause);

其中:
value_expression:可以是一个字段或一个内建函数。
offset是正整数,默认为1,指往前或往后几点记录.因组内第一个条记录没有之前的行,最后一行没有之后的行,
default就是用于处理这样的信息,默认为空。

再讲讲所谓的开窗函数,开窗函数就是 over([query_partition_clase] order_by_clause)。比如说,我采用sum求和,rank排序等等,但是我根据什么来呢?over提供一个窗口,可以根据什么什么分组,就 用partition by,然后在组内根据什么什么进行内部排序,就用 order by。

Oracal回顾--分析函数总结(1)相关推荐

  1. Oracle分析函数巧妙使用

    在 Oracle中使用Sql必须弄懂分析函数 Oracle开发专题之:分析函数(OVER) 1 Oracle开发专题之:分析函数2(Rank, Dense_rank, row_number) 6 Or ...

  2. Oracle--27分析函数

    Oracle分析函数--函数列表   SUM        :该函数计算组中表达式的累积和 MIN        :在一个组中的数据窗口中查找表达式的最小值 MAX        :在一个组中的数据窗 ...

  3. 323数字字符日期函数 回顾 plsql基础变量的使用ld

    -----------数字 字符 日期函数 ----数字函数:针对的对象的数据类型是数字 ABS(X):返回X的绝对值 mod(x,y):返回X除以Y的余数 power(x,y):返回X的Y次幂的结果 ...

  4. Oracle -- 分析函数

    MySQL中的derived table(r12... ORACLE利用STANDBY端RMAN备份... Oracle并行计算 Oracle 12CR2 dbca -silent -... MySQ ...

  5. oracle sql查询缺失号,Oracle层次查询和分析函数

    摘要 一组连续的数,去掉中间一些数,如何求出剩下的数的区间(即号段)?知道号段的起止,如何求出该号段内所有的数?知道一个大的号段范围和已经取过的号段,如何求出可用的号段?利用Oracle提供的强大的查 ...

  6. 回顾 2018,展望 2019

    1. 概述 今天是 2019 年第一天,趁着元旦 3 天假期时间,对即将过去的这一年做个总结回顾,看下这一年得到了什么,失去了什么,并对来年做个新的规划,看下需要采取哪些措施提升自己. 2. 2018 ...

  7. Jeff Dean回顾谷歌2021

    Jeff Dean回顾谷歌2021 新年伊始,谷歌AI掌门人Jeff Dean的年度总结「虽迟但到」,这篇万字长文系统回顾了过去一年来机器学习领域的五大趋势.除了超大AI模型,谷歌去年还做了啥? 20 ...

  8. ❤️Spark的关键技术回顾,持续更新!【推荐收藏加关注】❤️

    目录 前言 Spark的关键技术回顾 一.Spark复习题回顾 1.Spark使用的版本 2.Spark几种部署方式? 3.Spark的提交任务的方式? 4.使用Spark-shell的方式也可以交互 ...

  9. 2021年大数据Spark(四十二):SparkStreaming的Kafka快速回顾与整合说明

    目录 Kafka快速回顾 消息队列: 发布/订阅模式: Kafka 重要概念: 常用命令 整合说明 两种方式 两个版本API 在实际项目中,无论使用Storm还是SparkStreaming与Flin ...

最新文章

  1. 找父节点和子节点个数(Poj1634)
  2. 最近邻插值实现:图像任意尺寸变换
  3. 极客Web前端开发资源大荟萃#007
  4. Struts 2的文件上传
  5. python【蓝桥杯vip练习题库】ALGO-141 P1102(学生信息)
  6. tcp http https
  7. Java进阶:ReentrantLock实现原理解析(公平锁、非公平锁、可重入锁、自旋锁)
  8. 编写一个函数,计算下式当n=10和n=100的值。
  9. linq to entity常用操作
  10. 选修课期末html作业,中南大学生命科学导论选修课期末作业
  11. finereport前端组件类思维导图
  12. ArcMap提取不规则线的坐标
  13. 电脑故障维修常见的故障整理,电脑小白必备!
  14. 魅族 android 文件传输,魅族文件管理app提取下载
  15. 【三维点云滤波】对三维点云空间数据进行滤波的matlab仿真
  16. 国美金融贷款绝对定位与相对定位的关系(国美金融贷款位置)
  17. 利用python快速视频格式转换 解决 Premiere 导入TS文件只有声音没有视频
  18. Qt Creator 添加大恒相机SDK库
  19. ubuntu如何卸载软件
  20. 马斯洛人类需求五层次理论

热门文章

  1. 世界大学电子电气工程TOP10,国内大学哪家强?
  2. python 浮点数精度不准确_python 浮点数不精确原因
  3. OpenCV-10-直方图匹配/直方图规定化
  4. 布比并行快速的多链分片技术特性及实现原理 | 商用区块链BubiChain详解(三)
  5. DiscuzQ论坛的安装教程终极版
  6. 多种风机功率曲线的过滤方法
  7. modprobe和insmod的区别、 rmmod及modinfo
  8. 循环while和for语句
  9. 为什么纳斯达克和雅加达期货等传统交易所在转向区块链?
  10. php stderr,php标准输入与输出(STDIN、STDOUT、STDERR)