分组函数group by和Oracle中分析函数partition by的用法以及区别
来源:互联网 发布:安徽 淮南 大数据 编辑:程序博客网 时间:2024/04/28 05:59
今天有个同事给我打电话问我题目列出的这个问题,在日常开发中,确实它们俩都是与分组有关的,但是需要注意的是一个是分组函数另一个是分析函数,讲解用到的表就以Oracle中schema的scott的EMP表和DEPT表为例做讲解:
老总下命令说:需要统计下公司里每个部门的人数以及每个部门的工资发放的工资总和;先分析下统计每个部门的人数和工资总和,指的是将不同部门的人员分别放到不同的地方,然后再将不同部门的人数一个个数出来,以及工资一个个加出来,也就是说表里面的数据是零散的,通过分组函数分组后展示出来的是以组为单位的几个数据块,需要注意的是分组完成之后的数据块是一个整体为单位的,所以对于这个整体不允许使用比如针对块里单个对象做处理
,正式因为如此,很多初学的人都会犯这种类型的错误,好的,上SQL;
SELECT DEPTNO 部门编号,COUNT(*) AS 部门人数,SUM(sal) 部门工资总和 FROM emp GROUP BY deptno ORDER BY SUM(sal) DESC;结果就不贴出来了,可以看到的是整个EMP表里面的数据分成了三条,每条数据针对一个部门,对于分组函数而言,它不关心每个分组里面到底是由谁构成的,或者是相对于个体,分组函数是站在一个宏观的角度上看待数据的;
好的,那么又一个需求来了,如果需要显示每个部门的员工姓名、工资、该员工在部门里的工资排序,部门的工资总和呢?那么这个时候使用partition by就要方便的多,看代码:
SELECT deptno 部门名称 ,ename 员工姓名, sal 员工工资, ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY sal) 所在部门工资排序 FROM emp;说到这,大家估计开始琢磨到底什么区别了,同样,以求部门工资总和为例:
-- 使用分组函数GROUP BY方式SELECT deptno 部门编号,SUM(sal) 部门工资总和 FROM emp GROUP BY deptno;执行结果为:
下面再看一下:
-- 使用分析函数 PARTITION BY方式SELECT deptno 部门编号,SUM(SAL) OVER (partition by sal) 部门工资总和 FROM emp;输出结果为:
对于这个结果大家可能会比较奇怪,其实这也正是这两个函数的区别,如果还是觉得不清晰,再看下面这个更具体的例子:
SELECT deptno 部门名称 ,ename 员工姓名, sal 员工工资, SUM(sal) OVER(PARTITION BY deptno ORDER BY sal) 所在部门工资总和 FROM emp;输出结果:
通过上面三个例子可以得出以下结论:
1、字面意思上来看,分组函数是对于整体而言的,分析函数是用来分析个体而言的,呈现的结果也验证了这一点;
2、对于GROUP BY而言,是从整体宏观上把握分组后的数据模块,对于PARTITION BY而言,它虽然也是讲数据分组,但是它是从每个数据模块的个体出发,进行相应操作的,比如上述工资总和,比如每个部门有100个员工,用了它之后会有100条求和累加数据显示出来;
总之一句话,GROUP BY将分组后的块看成一个整体,忽略个体;PARTITION BY也是看成整体,但是重视个体!
- 分组函数group by和Oracle中分析函数partition by的用法以及区别
- 分组函数group by和Oracle中分析函数partition by的用法以及区别
- oracle分析函数over partition by 和group by的区别
- [Oracle]: Oracle分析函数 分组(partition by)
- 分组函数group by用法
- ORACLE分析函数over(partition by...)中使用case when达到多重分组的效果
- ORACLE分析函数over(partition by...)中使用case when达到多重分组的效果
- 分区函数partition by 与 分组函数group by 得区别
- Oracle分析函数中的分组排名函数用法 Rank Over partition by
- oracle的分析函数over(Partition by...)
- oracle的分析函数 over(Partition by...)
- oracle的分析函数over(Partition by...)
- oracle的分析函数over(Partition by...)
- 分组函数(group by)
- Oracle partition(分区) 替代 Group By 函数的写法
- oracle学习笔记(聚合函数以及group by 和having 的用法)
- oracle 分析函数和开窗函数 ROW_NUMBER() OVER(PARTITION BY.....)
- oracle数据库--关于使用分组函数以及group by的注意点
- myeclipse-2015-stable-2.0软件破解
- Android应用程序包扫描过程源码分析
- 【算法系列-7】堆
- Mac下配置Sdk platform-tools目录的环境变量
- 分布式锁实现
- 分组函数group by和Oracle中分析函数partition by的用法以及区别
- JAVA学习25_eclipse中文乱码问题解决方案
- InitializingBean afterPropertiesSet方法
- iOS开发-文件管理(一)
- oracle 使用DBMS_FLASHBACK恢复意外删除的数据
- 机器学习基本概念-3
- Set,List,Map,Vector,ArrayList的区别
- 数字三角形问题
- Android中各种组件的生命周期