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 目录下。