Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

时间:2021-10-24 21:37:29

(1)   函数:  over()的作用及用法:    -- 分区(分组)求和。

RANK ( ) OVER ( [query_partition_clause] order_by_clause )
DENSE_RANK ( ) OVER ( [query_partition_clause] order_by_clause )
可实现按指定的字段分组排序,对于相同分组字段的结果集进行排序,
其中PARTITION BY 为分组字段,ORDER BY 指定排序字段

over不能单独使用,要和分析函数:rank(),dense_rank(),row_number()/sum() 等一起使用。
其参数:over(partition by columnname1 order by columnname2)
含义:按columname1指定的字段进行分组排序,或者说按字段columnname1的值进行分组排序。

1.例如:employees表中,有两个部门的记录:department_id =10和20
select department_id,rank() over(partition by department_id order by salary) from employees就是指在部门10中进行薪水的排名,在部门20中进行薪水排名。如果是partition by org_id,则是在整个公司内进行排名。(org_id: 公司ID)

2.使用子分区(分组)查出各部门薪水连续的总和。注意按部门分区(分组)。注意over(...)条件的不同,
sum(sal) over (partition by deptno order by ename) 按部门“连续”求总和
sum(sal) over (partition by deptno) 按部门求总和
sum(sal) over (order by deptno,ename) 不按部门“连续”求总和
sum(sal) over () 不按部门,求所有员工总和,效果等同于sum(sal)。

SQL> break on deptno skip 1 -- 为效果更明显,把不同部门的数据隔段显示。
SQL> select deptno,ename,sal,
2 sum(sal) over (partition by deptno order by ename) 部门连续求和,--各部门的薪水"连续"求和
3 sum(sal) over (partition by deptno) 部门总和, -- 部门统计的总和,同一部门总和不变
4 sum(sal) over (order by deptno,ename) 连续求和, --所有部门的薪水"连续"求和
5 sum(sal) over () 总和, -- 此处sum(sal) over () 等同于sum(sal),所有员工的薪水总和
6 from emp ;

Result :

Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名

(2) Oracle中使用函数rank()over()排名的问题  --  不连续/连续排名

排序:

RANK( ) OVER(order by 列名 排序) 的结果是不连续的,如果有4个人,其中有3个是并列第1名,那么最后的排序结果结果如:1 1 1 4;

DENSE_RANK( ) OVER(order by 列名 排序) 的结果是连续的,如果有4个人,其中有3个是并列第1名, 那么最后的排序结果如:1 1 1 2;

如:

1.  SELECT COLA , RANK( ) OVER(order by COLE ASC )  E  FROM TABLE_A ;

2.  SELECT COLA , RANK( ) OVER(order by COLE ASC )  E  FROM TABLE_A ;

Result :

Oracle函数over(),rank()over()作用及用法--分区(分组)求和& 不连续/连续排名