SQL查詢每個部門工資前三名的員工信息


--通用sql
1 select deptno, ename, sal      
2 from emp e1     
3 where      
4    (  
5     select count(1)     
6     from emp e2     
7     where e2.deptno=e1.deptno and e2.sal>=e1.sal  
8    ) <=3 /*這里的數值表示你想取前幾名*/  
9 order by deptno, sal desc;    
--oracle查詢
1  select * from         
2  (select deptno,ename,sal,row_number() over (partition by deptno        
3     order by sal desc) rn         
4  from emp)         
5     where rn<3;  
row_number() OVER (PARTITION BY COL1 ORDER BY COL2) 表示根據COL1分組,在分組內部根據 COL2排序,而此函數計算的值就表示每組內部排序后的順序編號(組內連續的唯一的)

與rownum的區別在於:使用rownum進行排序的時候是先對結果集加入偽列rownum然后再進行排序,而此函數在包含排序從句后是先排序再計算行號碼.
  row_number()和rownum差不多,功能更強一點(可以在各個分組內從1開時排序).
  rank()是跳躍排序,有兩個第二名時接下來就是第四名(同樣是在各個分組內).
  dense_rank()l是連續排序,有兩個第二名時仍然跟着第三名。相比之下row_number是沒有重復值的

查詢每個部門的最高工資
select deptno,ename,sal from 
     (select deptno,ename,sal,row_number() over (partition by deptno order by sal desc) as sal_order 
         from scott.emp) where sal_order <2 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM