常用Oracle分析函数详解
原文鏈接:http://www.cnblogs.com/benio/archive/2011/06/01/2066106.html
---------------------------------------------------------------------------
學(xué)習(xí)步驟:
1. 擁有Oracle EBS demo 環(huán)境 或者 PROD 環(huán)境
2. copy以下代碼進 PL/SQL
3. 配合解釋分析結(jié)果
4. 如果網(wǎng)頁有點亂請復(fù)制到TXT中查看
/*假設(shè)一個經(jīng)理代表了一個部門
*/
SELECT emp.full_name,
? ?? ? emp.salary,
? ?? ? emp.manager_id,
? ?? ? row_number() over(PARTITION BY emp.manager_id ORDER BY emp.salary DESC) row_number_dept, --部門排行
? ?? ? rownum row_number, --行號
? ?? ? round((rownum + 1) / 4) page_number, --每4行一頁
? ?? ? ntile(2) over(ORDER BY emp.salary DESC) page_number_nt, --平均分成兩類
? ?? ??
? ?? ? AVG(emp.salary) over(PARTITION BY emp.manager_id) avg_salary_department, --該部門薪水均值
? ?? ? SUM(emp.salary) over(PARTITION BY emp.manager_id) sum_salary_department, --該部門薪水總額
? ?? ? COUNT(emp.salary) over(PARTITION BY emp.manager_id) count_emp_department, --部門所有的員工
? ?? ? dense_rank() over(PARTITION BY emp.manager_id ORDER BY emp.salary DESC) rank_salary_dept, --該人員的部門薪水排行
? ?? ? dense_rank() over(ORDER BY emp.salary DESC) rank_salary_company, --該人員的全公司排行
? ?? ??
? ?? ? MIN(emp.salary) over(PARTITION BY emp.manager_id) min_salary_dept, --部門的最低薪水? ?? ??
? ?? ? MIN(emp.salary) keep(dense_rank FIRST ORDER BY emp.salary) over(PARTITION BY emp.manager_id) min_salary_dept_first, --部門的最低薪水
? ?? ? first_value(emp.salary) over(PARTITION BY emp.manager_id ORDER BY emp.salary) min_salary_dept_firstv, --部門的最低薪水? ???
? ?? ??
? ?? ? MAX(emp.salary) over(PARTITION BY emp.manager_id) max_salary_dept, --部門的最高薪水?
? ?? ? MAX(emp.salary) keep(dense_rank LAST ORDER BY emp.salary) over(PARTITION BY emp.manager_id) max_salary_dept_last, --部門的最高薪水?
? ?? ? last_value(emp.salary) over(PARTITION BY emp.manager_id ORDER BY emp.salary) max_salary_dept_lastv, --部門的最高薪水
? ?? ??
? ?? ? lag(emp.full_name, 1, '00') over(ORDER BY emp.salary DESC) last_persion, --薪水在自己前一位的人
? ?? ? lead(emp.full_name, 1, '00') over(ORDER BY emp.salary DESC) next_persion --薪水在自己后一位的人
??FROM fwk_tbx_employees emp
ORDER BY emp.salary DESC
??
??1. 基本概念理解
??
? ???分析函數(shù)
? ?? ???1. 顧名思義,分析函數(shù)是在主查詢結(jié)果的基礎(chǔ)上進行一定的分析,如分部門匯總,分部門求均值等等。
? ???
? ???數(shù)據(jù)窗口
? ?? ???1. Oracle 分析函數(shù)建立在所謂的數(shù)據(jù)窗口之上,數(shù)據(jù)窗口可以理解為一個數(shù)據(jù)集合。主查詢的數(shù)據(jù)可以按照不同的標準分割成不同的數(shù)據(jù)集。比如partition BY manager_id?
? ???按照manager_id將主查詢的數(shù)據(jù)分成N(N代表有多少個不同的Manager_id)個不同的數(shù)據(jù)窗口。
? ?? ???2. 其次,數(shù)據(jù)窗口內(nèi)部還應(yīng)該與一定的順序通過 ORDER BY 實現(xiàn)
? ???
? ???分析函數(shù)和GROUP BY的區(qū)別和聯(lián)系
? ?? ???1. 分析函數(shù)的功能大部分都可以通過GROUP BY 來聚合完成
? ?? ???2. 分析函數(shù)查詢出來的行數(shù)是由主查詢決定的,GROUP BY 的行數(shù)結(jié)果是由GROUP BY 后面的集合構(gòu)成的唯一性組合決定的,通常比主查詢的結(jié)果行數(shù)少。
? ?? ?? ??
? ???
??2. 典型格式詳解
? ???
? ???SUM(emp.salary) over(PARTITION BY emp.manager_id) sum_salary_department, --該部門薪水總額
? ??
? ?功能簡介:
? ???當前行對應(yīng)人員所在部門的薪水總額
? ???AVG,count與之類似
? ???
? ?過程理解
? ???1. 首先將查詢出來的數(shù)據(jù)集按照MANAGER_ID分割
? ???2. 查找到當前行的MANAGER_ID對應(yīng)的數(shù)據(jù)集
? ???3. 對以上數(shù)據(jù)集合求和,生成一個結(jié)果附在新添加的列中
? ???
? ?? ?? ??
? ???dense_rank() over(PARTITION BY emp.manager_id ORDER BY emp.salary DESC) rank_salary_dept, --該人員的部門薪水排行
? ???
? ?功能簡介:
? ???當前行對應(yīng)人員在所在部門的薪水排名(不出現(xiàn)并列情況,相同的值也會依次有不同的排序,且排序連續(xù))
? ???RANK 函數(shù)與之相反,要出現(xiàn)并列的情況啊,且并列將導(dǎo)致排名不連續(xù)如A和B并列第一,那么將沒有第二名,而直接出現(xiàn)第三名
? ?過程理解
? ???1. 首先將查詢出來的數(shù)據(jù)集按照MANAGER_ID分割
? ???2. 對當前行MANAGER_ID對應(yīng)的數(shù)據(jù)集進行排序
? ???3. 將本行對應(yīng)的行號提取并附在附加列中
? ???
? ???MIN(emp.salary) keep(dense_rank FIRST ORDER BY emp.salary) over(PARTITION BY emp.manager_id)??min_salary_dept_first, --部門的最低薪水
? ???
? ?功能簡介:
? ???當前行對應(yīng)人員在所在部門的最低薪水
? ???MAX函數(shù)與之類似
? ?過程理解
? ???1. 首先將查詢出來的數(shù)據(jù)集按照MANAGER_ID分割
? ???2. 對當前行MANAGER_ID對應(yīng)的數(shù)據(jù)集進行排序,提取最前面的行,最前面的行的值有相等的,那么返回多行
? ???3. 在返回的多行中,提取薪水最小的行,并提取salary字段
? ???
? ???first_value(emp.salary) over(PARTITION BY emp.manager_id ORDER BY emp.salary) min_salary_dept_firstv, --部門的最低薪水??
? ???
??功能簡介:
? ???當前行對應(yīng)人員在所在部門的最低薪水
? ???last_value與之相反,求的是最后一個值
? ?
? ?過程理解
? ???1. 首先將查詢出來的數(shù)據(jù)集按照MANAGER_ID分割
? ???2. 對當前行MANAGER_ID對應(yīng)的數(shù)據(jù)集進行排序
? ???3. 提取第一行的salary字段
? ???
? ???
? ?LAG(EMP.FULL_NAME, 1, '00') OVER (ORDER BY EMP.SALARY DESC)??LAST_PERSION, --薪水在自己前一位的人
? ???
? ?功能簡介:
? ???總體薪水排名中,比自己高一位的人的名字
? ???lead 函數(shù)與之相反求的在自己后面的人
? ??
? ?參數(shù)介紹:
? ???LAG(p_segment, p_distance, p_defaualt_val)
? ???1. p_segment: 需要提取的字段
? ???2. p_distance:>=0的數(shù),表示比當前人員前面了幾位
? ???3. p_defaualt_val: 當當前行沒有比它前的行的時候,顯示默認值
? ?
? ?過程理解
? ???1. 首先將查詢出來的數(shù)據(jù)集按照薪水進行降序排序
? ???2. 提取前p_distance位的p_segment字段
總結(jié)
以上是生活随笔為你收集整理的常用Oracle分析函数详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Flume实战监听网络端口
- 下一篇: 两年Java工作经验应该会些什么技术