Oracle分析函数入门教程

2019-07-12 20:52:05

一:分析函数是什么?
分析函数是Oracle专门用于解决复杂报表统计需求的功能强大的函数,它可以在数据中进行分组然后计算基于组的某种统计值,并且每一组的每一行都可以返回一个统计值。

二:分析函数和聚合函数的不同之处是什么?

普通的聚合函数用group by分组,每个分组返回一个统计值,而分析函数采用partition by分组,并且每组每行都可以返回一个统计值。

三:分析函数的形式
分析函数带有一个开窗函数over(),包含两个分析子句:分组(partition by)、 排序(order by),他们的使用形式如下:over(partition by xxx order by yyy)。

四:分析函数例子(在scott用户下模拟)

示例一:按照部分Id分组,然后计算每组薪水的最大值

1 select employee_id,last_name,department_id,salary,max(salary) over(partition by department_id) "max_val"
2 from cux_employees
3 order by employee_id

运行结果:

示例二:按照部门名称分组,然后按照部门内员工薪水升序排列,计算每组成员薪水的排序情况

1 SELECT d.department_name,
2        e.last_name,
3        e.salary,
4        rank() over(PARTITION BY d.department_name ORDER BY e.salary) dept_salary_rank1,
5        dense_rank() over(PARTITION BY d.department_name ORDER BY e.salary) dept_salary_rank2,
6        row_number() over(PARTITION BY d.department_name ORDER BY e.salary) dept_salary_rank3
7 FROM cux_employees e,cux_departments d
8 WHERE e.department_id = d.department_id

运行结果:

补充:

rank(),dense\_rank(),row\_number()的区别

一:语法
rank() over([partition by col1] order by col2)
dense\_rank() over([partition by col1] order by col2)
row\_number() over([partition by col1] order by col2)
其中[partition by col1]可省略。

二:区别
三个分析函数都是按照col1分组内从1开始排序。

row\_number():是没有重复值的排序(即使两天记录相等,顺序值也是不重复的);

dense\_rank(): 是连续排序,两个第二名下来的是第三名;

rank(): 是跳跃排序,两个第二名下来就是第四名。

当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »