我希望获得每个部门的前3名不同的薪水。我可以使用RANK()DENSE_RANK()ROW_NUMBER()做到这一点,但是我的表中有一些薪水相同的记录。

下面提到的是我的查询及其结果。

第20部门的前3名工资应该是6000、3000、2975。
但是,有2名员工的薪水为3000,并且他们都具有等级2。因此,这给了我该部门4条记录(等级1为1,等级2为2记录,等级3为1记录)。

请就如何获得每个部门的前三名薪水提出建议/建议。

询问:

SELECT * FROM (
SELECT EMPNO, DEPTNO, SAL,
DENSE_RANK() over (partition by deptno order by sal DESC) as RANK,
row_number() over (partition by deptno order by sal DESC) as ROWNO
from EMP)
WHERE RANK <= 3;

结果:
Empno Deptno    Salary Rank   Rowno
----------------------------------------
7839    10      5000    1      1
7782    10      2450    2      2
7934    10      1300    3      3
7935    20      6000    1      1
7788    20      3000    2      2
7902    20      3000    2      3
7566    20      2975    3      4
7698    30      2850    1      1
7499    30      1600    2      2
7844    30      1500    3      3

最佳答案

如果您对row_numberpartitioning by dept,salary有了更具体的说明,则可以在此查询中组合row_numberdense_rank:

with data_row as
(
select 7839 as empno, 10 as deptno, 5000 as salary from dual union all
select 7782 as empno, 10 as deptno, 2450 as salary from dual union all
select 7934 as empno, 10 as deptno, 1300 as salary from dual union all
select 1111 as empno, 10 as deptno, 1111 as salary from dual union all
select 7935 as empno, 20 as deptno, 6000 as salary from dual union all
select 7788 as empno, 20 as deptno, 3000 as salary from dual union all
select 7902 as empno, 20 as deptno, 3000 as salary from dual union all
select 7566 as empno, 20 as deptno, 2975 as salary from dual union all
select 2222 as empno, 20 as deptno, 2222 as salary from dual union all
select 7698 as empno, 30 as deptno, 2850 as salary from dual union all
select 7499 as empno, 30 as deptno, 1600 as salary from dual union all
select 7844 as empno, 30 as deptno, 1500 as salary from dual union all
select 3333 as empno, 30 as deptno, 1333 as salary from dual
)
select *
from
(
select
       deptno,
       salary,
       dense_rank() over (partition by deptno order by salary desc) as drank,
       row_number() over (partition by deptno, salary order by salary desc) as rowno

from data_row
)
where drank <=3 and
      rowno =1

关于sql - Oracle SQL-如何使用RANK()或DENSE_RANK()和ROW_NUMBER()分析函数获取不同的行?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23452997/

10-16 16:38