Oracle Rank OverRow

xiaoxiao2025-08-16  12

Oracle 提供了三个函数

1) Rank()

2) Row_Number()

3) Dense_Rank()

均需要配合开窗函数Over()使用.这三个函数功能类似,均有统计排名的意味;

以下使用Oracle自带的scott/tiger用户作为例子:

SELECT T.*, ROW_NUMBER() OVER(PARTITION BY T.DEPTNO ORDER BY TO_CHAR(T.HIREDATE, 'YYYY') DESC) COL1, RANK() OVER(PARTITION BY T.DEPTNO ORDER BY TO_CHAR(T.HIREDATE, 'YYYY') DESC) COL2, DENSE_RANK() OVER(PARTITION BY T.DEPTNO ORDER BY TO_CHAR(T.HIREDATE, 'YYYY') DESC) COL3, COUNT(1) OVER() COUNT FROM EMP T ORDER BY T.DEPTNO;

SQL查询每个员工分别在自己所在部门入职年份排名,查询结果如下:

对比COL1,COL2,COL3,可以发现这三个函数的区别.

补充:Oracle的分析函数partition by用法类似聚合函数group by;

给出一个示例:

SELECT DEPTNO 部门内码, ENAME 员工姓名, SAL 薪水, SUM(SAL) OVER(PARTITION BY DEPTNO ORDER BY ENAME) 部门连续求和, --各部门的薪水"连续"求和 SUM(SAL) OVER(PARTITION BY DEPTNO) 部门总和, -- 部门统计的总和,同一部门总和不变 100 * ROUND(SAL / SUM(SAL) OVER(PARTITION BY DEPTNO), 4)||'%' "部门份额(%)", SUM(SAL) OVER(ORDER BY DEPTNO, ENAME) 连续求和, --所有部门的薪水"连续"求和 SUM(SAL) OVER() 总和, -- 此处SUM(SAL) OVER () 等同于SUM(SAL),所有员工的薪水总和 100 * ROUND(SAL / SUM(SAL) OVER(), 4)||'%' "总份额(%)" FROM EMP ORDER BY DEPTNO;

查询结果:

使用Oracle,学会分析函数在某些场合真的是非常好用.

转载请注明原文地址: https://www.6miu.com/read-5034924.html

最新回复(0)