分析函數——函數 RANK,DENSE_RANK,FIRST,LAST

1,RANK(總結:下圖中出現了兩個2,就沒有序列3了)
功能描述:根據 ORDER BY 子句中表達式的值,從查詢返回的每一行,計算它們與其它行的
相對位置。組內的數據按 ORDER BY 子句排序,然後給每一行賦一個號,從而形成一個序列,
該序列從 1 開始,往後累加。每次 ORDER BY 表達式的值發生變化時,該序列也隨之增加。
有同樣值的行得到同樣的數字序號(認爲 null 時相等的)。然而,如果兩行的確得到同樣的
排序,則序數將隨後跳躍

2,DENSE_RANK(總結:序號不跳躍,出現並排第二,並排第三等)
功能描述:根據 ORDER BY 子句中表達式的值,從查詢返回的每一行,計算它們與其它行的
相對位置。組內的數據按 ORDER BY 子句排序,然後給每一行賦一個號,從而形成一個序列,
該序列從 1 開始,往後累加。每次 ORDER BY 表達式的值發生變化時,該序列也隨之增加。
有同樣值的行得到同樣的數字序號(認爲 null 時相等的)。密集的序列返回的時沒有間隔的
數。
-----------------------------------------------------------------------
例子:
1,下例中計算每個員工按薪水排序
SELECT DEPARTMENT_ID,
FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
SALARY,
RANK() OVER(ORDER BY SALARY) AS RANK_ORDER,
DENSE_RANK() OVER(ORDER BY SALARY) AS DENSE_RANK_ORDER
FROM HR.EMPLOYEES

2,計算每個員工按部門分區再按薪水排序
SELECT DEPARTMENT_ID,
FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
SALARY,
RANK() OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS RANK_PART_ORDER,
DENSE_RANK() OVER(PARTITION BY DEPARTMENT_ID ORDER BY SALARY) AS DENSE_RANK_PART_ORDER
FROM HR.EMPLOYEES

注意點:
1,是以一個部門爲一組,然後在按薪酬來排名,
2,rank() 是有跳躍的
3,dense_rank()是沒有跳躍的
----------------------------------------------------------------------------------------------------------------
3,FIRST
功能描述:從 DENSE_RANK 返回的集合中取出排在最前面的一個值的行(可能多行,因爲
值可能相等),因此完整的語法需要在開始處加上一個集合函數以從中取出記錄

4,LAST
功能描述:從 DENSE_RANK 返回的集合中取出排在最後面的一個值的行(可能多行,因爲
值可能相等),因此完整的語法需要在開始處加上一個集合函數以從中取出記錄

例子:
DENSE_RANK 按部門分區,再按佣金 commission_pct 排序,FIRST 取
出佣金最低的對應的所有行,然後前面的 MAX 函數從這個集合中取出薪水最低的值;LAST
取出佣金最高的對應的所有行,然後前面的 MIN 函數從這個集合中取出薪水最高的值
SELECT DEPARTMENT_ID,
FIRST_NAME || ' ' || LAST_NAME EMPLOYEE_NAME,
HIRE_DATE,
SALARY,
MAX(SALARY) KEEP(DENSE_RANK FIRST ORDER BY HIRE_DATE) OVER(PARTITION BY DEPARTMENT_ID) "WORST",
MIN(SALARY) KEEP(DENSE_RANK LAST ORDER BY HIRE_DATE) OVER(PARTITION BY DEPARTMENT_ID) "BEST"
FROM HR.EMPLOYEES
WHERE DEPARTMENT_ID = 30--便於分析取部門爲30的員工,以HIRE_DATE做升序
ORDER BY HIRE_DATE ASC


注意點:
1,DENSE_RANK 按部門分區(PARTITION BY DEPARTMENT_ID)
2 ,KEEP (DENSE_RANK FIRST ORDER BY hire_date) 按HIRE_DATE做升序
3,MAX(SALARY)是爲DENSE_RANK 返回的集合中取出排在最前面的HIRE_DATE是有多行,在這個集合中選最大的SALARY
4,MIN(SALARY)是爲DENSE_RANK 返回的集合中取出排在最後面的HIRE_DATE是有多行,在這個集合中選最小的SALARY

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