Oracle Partition By 的使用

1.概述

Parttion by 關鍵字是Oracle中分析性函數的一部分,它和聚合函數不一樣的地方在於它可以返回一個分組中的多條記錄,兒聚合函數通常只有一條反映統計值的結果。ide

 

2.使用方式

 

   場景:查詢出每一個部門工資最低的員工編號【每一個部門可能有兩個最低的工資員工】  函數

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);
View Code

  

查詢結果:spa

2.1方法一

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 

2.2方法二

select * from tsaler 
inner join(select min(salary) as salary,deptid from tsaler group by deptid) c
using(salary,deptid)

2.3方法三

--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;
相關文章
相關標籤/搜索