Oracle-- (RANK) 排名函數



內容來自: Oracle® Database SQL Language Reference 11g Release 2 (11.2) E41084-03。

empolyees表來自hr方案。


RANK函數可以計算值在特定排序中的位置(使用聚合語法)及按指定列的值計算排名(使用統計語法)。

聚合語法的火車圖

image

下面語句計算了工資$2215和佣金為0.5%的員工在查詢結果中排名。

SELECT RANK(2015, .05) WITHIN GROUP
(ORDER BY salary, commission_pct) "Rank"
FROM employees_t;

查詢結果:

      Rank
----------
         1

ORDER BY:指定了排序字段,查詢集合只有通過該子句排序,我們才可以獲取值在排序好的集合中的位置。

RANK:該函數的參數數量必須與ORDER BY字段的數量相同。

DESC、ASC:如果不指定降序(DESC),集合將按照升序(ASC)排列,所以排名既可以按升序也可以按降序排列。

NULLS FIRST、NULLS LAST:指定NULL值在排列中放在開頭還是放在結尾,所以這會影響值排名。

 

統計語法的火車圖

image

該語法適合查詢排名前幾位或排名后幾位的記錄

下面語句可以查詢部門60的所有員工的排名,排名按照工資由低到高:

SELECT department_id, last_name, salary,
RANK() OVER (PARTITION BY department_id ORDER BY salary ) RANK
FROM employees_t WHERE department_id = 60
ORDER BY RANK, last_name;

查詢結果:

DEPARTMENT_ID LAST_NAME                     SALARY       RANK
------------- ------------------------- ---------- ----------
           60 Lorentz                      4200.00          1
           60 Austin                       4800.00          2
           60 Pataballa                    4800.00          2
           60 Ernst                        6000.00          4
           60 Hunold                       9000.00          5

RANK:不需要指定參數。

OVER:指定排名對象。
PARTITION BY:可以分區排名,指定分區字段。

ORDER BY:與聚合語法中的ORDER BY用法一樣。

在上面的例子中,分別對每個部分中員工進行排名,這里僅顯示了部門60。注意,排名號可能不是連續的,如果有兩個排名第二的記錄,他們的排名號都是2,緊接着則是排名號為4的記錄。

下面是幾個使用示例:

分別選出各部門工資最高的員工:

select * from (select department_id,salary, rank() over(partition by department_id order by salary desc) rank from employees t) where rank=1;

 


免責聲明!

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



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