[英]Oracle SQL - How to get distinct rows using RANK() or DENSE_RANK() or ROW_NUMBER() analytic function?
我希望获得每个部门的前3名不同薪水。 我能够使用RANK()
或DENSE_RANK()
或ROW_NUMBER()
来完成它,但我的表中有一些工资相同的记录。
下面提到的是我的查询及其结果。
第20部门的前3名工资应该是6000,3000,2975。但是有2名员工的工资为3000,他们都有2级。所以它给了我这个部门的4条记录(1级为1级,2条记录为rank3和rank3的1级记录。
请建议/建议如何获得每个部门的独特前3名工资。
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_number
更具体, partitioning by dept,salary
那么你可以在这个查询中组合row_number
和dense_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
你使用的row_number
函数应该做的伎俩:
SELECT *
FROM (SELECT empno, deptno, sal
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) as rk,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) as rowno
FROM emp)
WHERE rowno <= 3;
请试试:
SELECT empno, deptno, DISTINCT(sal)
FROM (SELECT empno, deptno, sal
DENSE_RANK() OVER (PARTITION BY deptno ORDER BY sal DESC) as rk,
ROW_NUMBER() OVER (PARTITION BY deptno ORDER BY sal DESC) as rowno
FROM emp)
WHERE rowno <= 3;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.