- RANK():返回数据项在分组中的排名,在排名相等时会在名次中留下空位,造成排名不连续。
- DENSE_RANK():同样返回数据项在分组中排名,不过在排名相等时不会留下名位空位。
- CUME_DIST():返回特定值相对于一组值的位置,是累积分布(cumulative distribution)的简写。
- PERCENT_RANK():返回某个值相对于一组值的百分比排名。
- NTILE():返回n分片后的值,如三分片、四分片等。
- ROW_NUMBER():为每一条分组记录返回一个数字,注意不同于rownum伪列。
partition by相当于group by,根据order分组。
特别注意:
select row_number()over(partition by deptno order by deptno),deptno,sal from emp;
select dense_rank()over(partition by deptno order by deptno),deptno,sal from emp;
select rank()over(partition by deptno order by deptno),deptno,sal from emp;
说明:dense_rank,rank()序号全部显示1,因为order by 的值都是相同的,group by后都是相同的值,所以全部显示1.
row_number函数:连续编号,不跳跃,例如1 2 3 4 5
select deptno,empno,sal,row_number() over(partition by deptno order by sal desc) as row_number from emp;
rank()函数:连续跳跃编号,例如:113。。。
select deptno,empno,sal,rank() over(partition by deptno order by sal desc) as rank from emp;
dense_rank()函数:连续不跳跃编号,例如:112
select deptno,empno,sal,dense_rank() over(partition by deptno order by sal desc) as dense from emp;
eg:查询emp表,查询每个部门最高的工资
select * from
(select deptno,sal,row_number() over(partition by deptno order by sal desc) as sn from emp )
where sn=1;