天天看點

oracle 分析函數應用

常用的一些分析函數

再在自己安裝的資料的hr使用者模式下測試

<span style="font-size:14px;">SELECT emp.first_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, --行号
       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) dense_rank_salary_company, --該人員的全公司密集排行
       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.first_name, 1, '00') over(ORDER BY emp.salary DESC) last_persion, --薪水在自己前一位的人
       lead(emp.first_name, 1, '00') over(ORDER BY emp.salary DESC) next_persion --薪水在自己後一位的人
  FROM employees emp
ORDER BY emp.salary DESC;</span>
           

其中ntile函數 文法: ntile(expr) over([partition_clause] order_by_clause) 可以看作是把有序的資料集合平均配置設定到expr指定的數量的桶中,将桶号配置設定給每一行。 如果不能平均配置設定,則較小桶号的桶配置設定額外的行,并且各個桶中能放的行數最多相差1。

其中 rank() over,dense_rank() over,row_number() over函數的差別 http://blog.csdn.net/huhu307/article/details/51177346

其中lag函數 文法:lag ( expression [, offset [, default] ] )

over ( [ query_partition_clause ] order_by_clause ) 落後于誰,offset落後幾位,default不落後任何人時顯示的預設值

lead函數與lag剛好相反。

繼續閱讀