/*假设一个经理代表了一个部门 */ 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. Oracle 分析函数建立在所谓的数据窗口之上,数据窗口可以理解为一个数据集合。主查询的数据可以按照不同的标准分割成不同的数据集。比如partition BY manager_id 按照manager_id将主查询的数据分成N(N代表有多少个不同的Manager_id)个不同的数据窗口。 2. 其次,数据窗口内部还应该与一定的顺序通过 ORDER BY 实现
分析函数和GROUP BY的区别和联系 1. 分析函数的功能大部分都可以通过GROUP BY 来聚合完成 2. 分析函数查询出来的行数是由主查询决定的,GROUP BY 的行数结果是由GROUP BY 后面的集合构成的唯一性组合决定的,通常比主查询的结果行数少。
2. 典型格式详解
SUM(emp.salary) over(PARTITION BY emp.manager_id) sum_salary_department, --该部门薪水总额