Oracle開發之SQL語句案例—分析函數的使用

創建僱員表:

create table emp(deptno number(10),ename varchar2(100),sal number(10,2));

插入數據

begin
insert into emp values('10','KING',5000);
insert into emp values('10','CLARK',2450);
insert into emp values('10','MILLER',1300);
insert into emp values('20','SCOTT',3000);
insert into emp values('20','FORD',3000);
insert into emp values('20','JONES',2975);
insert into emp values('20','ADAMS',1100);
insert into emp values('20','SMITH',800);
insert into emp values('30','BLAKE',2850);
insert into emp values('30','ALLEN',1600);
insert into emp values('30','TURNER',1500);
insert into emp values('30','WARD',1250);
insert into emp values('30','MARTIN',1250);
insert into emp values('30','JAMES',950);
commit;
end;

1、使用row_number()、rank()、dense_rank()查出各部門薪水最高的三個員工姓名、薪水,多於三個的只取三個。
select *
  from (select e.deptno,
               e.ename,
               e.sal,
               row_number() over(partition by e.deptno order by sal desc) rankno
          from emp e)
 where rankno <= 3;

 

select *
  from (select e.deptno,
               e.ename,
               e.sal,
              
rank() over(partition by e.deptno order by sal desc) rankno
          from emp e)
 where rankno <= 3;

 

select *
  from (select e.deptno,
               e.ename,
               e.sal,
              
row_number() over(partition by e.deptno order by sal desc) rankno
          from emp e)
 where rankno <= 3;

 

select *
  from (select e.deptno,
               e.ename,
               e.sal,
              
dense_rank() over(partition by e.deptno order by sal desc) rankno
          from emp e)
 where rankno <= 3;

注:row_number()排名的名次不會出現重複;rank()則會出現排名名次相同且如果兩人的名次都爲2,則下個人的名次則爲4而不是爲3,而dense_rank()則與rank()恰好相反。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章