如何在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;
看来问题要被删了,不过还不如有正确答案呢
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;
看来问题要被删了,不过还不如有正确答案呢