1.ROW_NUMBER
ROW_NUMBER() OVER( PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2排序
此函数计算的值就表示每组内部排序后的顺序编号,组内连续且唯一
ROWNUM是伪列,ROW_NUMBER功能更强,可以直接从结果集中取出子集
场景:按照部门编码分组显示,每组内按职员编码排序,并赋予组内编码
SELECT deptno,ename,empno,
ROW_NUMBER() OVER(PARTITION BY deptno ORDER BY empno) AS emp_id
FROM emp;
2.RANK
RANK() OVER(PARTITION BY col1 ORDER BY col2)
表示根据col1分组,在分组内部根据col2给予等级标识
等级标识即排名,相同的数据返回相同的排名
跳跃排序,如果有相同数据,则排名相同,比如并列第二,则两行数据都标记为2,但下一位将是第四名
和ROW_NUMBER的区别是有重复值,而ROW_NUMBER没有
场景:按照部门编码分组,同组内按薪水倒序排序,相同薪水则按奖金数正序排列,并给予组内等级,用Rank_ID表示
SELECT deptno,ename,sal,comm,
RANK() OVER (PARTITION BY deptno ORDER BY sal DESC,comm) "Rank_ID"
FROM emp;
3.DENSE_RANK
DENSE_RANK OVER( PARTITION BY col1 ORDER BY col2)
表示根据 col1分组,在分组内部根据col2给予等级标识
即排名,相同的数据返回相同排名
连续排序,如果有并列第二,下一个排序将是三,这一点是和RANK的不同,RANK是跳跃排序