內容來自: Oracle® Database SQL Language Reference 11g Release 2 (11.2) E41084-03。
empolyees表來自hr方案。
RANK函數可以計算值在特定排序中的位置(使用聚合語法)及按指定列的值計算排名(使用統計語法)。
聚合語法的火車圖:
下面語句計算了工資$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值在排列中放在開頭還是放在結尾,所以這會影響值排名。
統計語法的火車圖:
該語法適合查詢排名前幾位或排名后幾位的記錄
下面語句可以查詢部門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;


