如何在emp表中获得两个最高薪水?

时间:2016-02-02 14:50:28

标签: sql oracle rownum

BREAK ON DEPTNO SKIP 1
compute sum of sal on deptno
 SELECT  deptno, empno, ename,sal FROM
  (SELECT  deptno, empno, ename, sal FROM emp )
  WHERE  EXISTS  (SELECT deptno  FROM dept)     order by 1,2 , sal desc ;

如何从emp获得两个最高的sal,以及我的代码有什么问题?

3 个答案:

答案 0 :(得分:2)

如果您希望每个部门的所有行具有两个最高的不同工资,请按以下方式使用dense_rank()

select deptno, empno, ename, sal
from (select e.*, 
             dense_rank() over (partition by deptno, order by sal desc) as seqnum
      from emp e
     ) e
where seqnum <= 2
order by deptno, sal desc;

看起来问题会被删除,但也可能有正确的答案。

答案 1 :(得分:1)

你想要的并不完全清楚。在标题中你说&#34;两个最高薪水&#34;,但在评论中你提到了一些关于总和的事情。

以下将显示两个最高薪水。如果有多个&#34;最高&#34;所有工资都将显示

select deptno, empno, ename, sal
from (
  SELECT deptno, empno, ename, sal, 
         dense_rank() over (order by sal desc) as rnk
  FROM emp
) 
where rnk <= 2
order by sal desc;

要获得每个部门的这个,您可以使用:

select deptno, dept_salary
from (
  select deptno, dept_salary, 
         dense_rank() over (order by dept_salary desc) as rnk
  from (
    SELECT deptno, sum(sal) as dept_salary
    FROM emp
    group by deptno
  ) t1
) t2
where rnk <= 2
order by dept_salary desc

答案 2 :(得分:0)

实际上是简单查询:

SELECT  deptno, empno, ename,sal FROM emp eb
WHERE (deptno, empno) IN
   (SELECT depno, empno FROM
       (SELECT deptno, empno FROM emp ei
           WHERE ei.deptno = eb.deptno
           ORDER BY ei.sal DESC
       ) WHERE rownum <= 2
    );

最后WHERE rownum <=2不同于SQL到SQL,在Mysql中你需要LIMIT 2,在MSSQL Server中,你需要在Oracle SELECT TOP 2中进行WHERE rownum <= 2。取决于您使用的引擎。