Oracle 分析函数 排名 row_number(), rank(), dense_rank(), Partition By
/* Parttion by 关键字是Oracle中分析性函数的一部分, 它和聚合函数不同的地方在于它能够返回一个分组中的多条记录, 而聚合函数一般只有一条反映统计值的结果。 */ --示例查询出每个部门工资最低的员工编号【每个部门可能有多个最低的工资员工】 create table tsaler( userid varchar(10), salary number, deptid varchar(1) ); insert into tsaler(userid, salary, deptid) values('1', '200', '1'); insert into tsaler(userid, salary, deptid) values('2', '2000', '1'); insert into tsaler(userid, salary, deptid) values('3', '200', '1'); insert into tsaler(userid, salary, deptid) values('4', '1000', '2'); insert into tsaler(userid, salary, deptid) values('5', '1000', '2'); insert into tsaler(userid, salary, deptid) values('6', '3000', '2'); commit; --方法一 select tsaler.* from tsaler inner join (select min(salary) as salary, deptid from tsaler group by deptid) c on tsaler.salary = c.salary and tsaler.deptid = c.deptid; --方法二 select * from tsaler inner join (select min(salary) as salary, deptid from tsaler group by deptid) c using (salary, deptid); --方法三 --row_number() 顺序排序 select row_number() over(partition by deptid order by salary) my_rank ,deptid,USERID,salary from tsaler; --rank() (跳跃排序,如果有两个第一级别时,接下来是第三级别) select rank() over(partition by deptid order by salary) my_rank,deptid,USERID,salary from tsaler; --dense_rank()(连续排序,如果有两个第一级别时,接下来是第二级) select dense_rank() over(partition by deptid order by salary) my_rank,deptid,USERID,salary from tsaler; --① select * from (select rank() over(partition by deptid order by salary) my_rank, deptid, USERID, salary from tsaler) where my_rank = 1; --② select * from (select dense_rank() over(partition by deptid order by salary) my_rank, deptid, USERID, salary from tsaler) where my_rank = 1;