Oracle 的分组查询(group by, partition by)

本文中将使用的表及内容:

group by

如查询各个部门的薪水之和与平均薪水:

它和下面这句(用 partition by)等价:

partition by

它通常和 over 一起用,并且在 select 关键字后列举的属性中。

如分别对各个部门的记录按雇佣时间(hiredate)排序:

需要说明的是上面用到了「记录名次」的 rank() 函数,它反映的名次,如果有两个值相等,那么他们的 rank() 值是相等的。

如按工资由高到低对各部门成员排序:

和 rank() 不同,row_number() 就仅仅「编号」,而不用「记录名次」,下面的例子仅仅将上面查询中的 rank() 换作 row_number()函数:

如何求全部雇员的薪水排名?去掉分组用的 partition by 部分就可以了:

题目

1. 找出 emp 表中薪水第二高的记录。

答:如图

2. 查询各部门薪水排名前二的记录。

答:如图

后记

暂时不知道除了 Oracle 别的数据库是否支持这个特性,目前本文暂放在 Oracle 目录下。