Parttion by 關鍵字是Oracle中分析性函數的一部分,它和聚合函數不一樣的地方在於它可以返回一個分組中的多條記錄,兒聚合函數通常只有一條反映統計值的結果。ide
場景:查詢出每一個部門工資最低的員工編號【每一個部門可能有兩個最低的工資員工】 函數
create table TSALER ( userid NUMBER(10), salary NUMBER(10), deptid NUMBER(10) ) -- Add comments to the columns comment on column TSALER.userid is '員工ID'; comment on column TSALER.salary is '工資'; comment on column TSALER.deptid is '部門ID'; insert into TSALER (工號, 工資, 部門編號) values (1, 200, 1); insert into TSALER (工號, 工資, 部門編號) values (2, 2000, 1); insert into TSALER (工號, 工資, 部門編號) values (3, 200, 1); insert into TSALER (工號, 工資, 部門編號) values (4, 1000, 2); insert into TSALER (工號, 工資, 部門編號) values (5, 1000, 2); insert into TSALER (工號, 工資, 部門編號) values (6, 3000, 2);
查詢結果:spa
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; -------方案3解決方案 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;