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

How to get two highest salary in emp table?

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,我的代码有什么问题?

实际简单查询:

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服务器中,您需要在 Oracle WHERE rownum <= 2 中执行 SELECT TOP 2。取决于您使用的引擎。

不是很清楚你想要什么。在标题中你说 "two highest salary",但在评论中你提到了一些关于总和的事情。

以下将显示最高的两个薪水。如果有多个 "highest" 工资,将显示所有

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

如果您想要每个部门中具有两个最高不同薪水的所有行,则使用 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;

看来问题要被删了,不过还不如有正确答案呢