/*
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;