[英]i want to find all the record against second highest salary in table and there many employee with second highest salary how to do that
[英]I want to query difference between first and second highest salary
我已经拿到了第二高的薪水。
我想显示:员工姓名、薪水、部门名称,以及最高和次高薪水之间的差异。
这是我当前的代码。
select max(SAL) SecondHighestSalary
from EMP A, DEPT B
where SAL < (
select max(A.SAL)
from EMP A, DEPT B
where A.DEPTNO = B.DEPTNO and B.LOC = 'New York'
);
谢谢
使用DENSE_RANK
(如果您想要最高的两个唯一工资值)或ROW_NUMBER
(如果您想要两个收入最高的人的工资而不管关系如何)分析函数,然后使用条件聚合:
SELECT MAX( CASE WHEN sal_rank = 1 THEN sal END )
- MAX( CASE WHEN sal_rank = 2 THEN sal END ) AS sal_difference_ignore_ties,
MAX( CASE WHEN sal_rownum = 1 THEN sal END )
- MAX( CASE WHEN sal_rownum = 2 THEN sal END ) AS sal_difference_with_ties
FROM (
SELECT e.deptno,
e.sal,
DENSE_RANK() OVER ( ORDER BY e.sal DESC ) AS sal_rank,
ROW_NUMBER() OVER ( ORDER BY e.sal DESC ) AS sal_rownum
FROM emp e
INNER JOIN dept d
ON ( e.deptno = d.deptno )
WHERE d.loc = 'New York'
);
其中,对于样本数据:
CREATE TABLE emp ( deptno, sal ) AS
SELECT 1, 2000 FROM DUAL UNION ALL
SELECT 1, 2000 FROM DUAL UNION ALL
SELECT 1, 1000 FROM DUAL UNION ALL
SELECT 1, 500 FROM DUAL UNION ALL
SELECT 1, 200 FROM DUAL UNION ALL
SELECT 2, 2000 FROM DUAL UNION ALL
SELECT 2, 1500 FROM DUAL UNION ALL
SELECT 2, 200 FROM DUAL UNION ALL
SELECT 2, 700 FROM DUAL;
CREATE TABLE dept ( deptno, loc ) AS
SELECT 1, 'New York' FROM DUAL UNION ALL
SELECT 2, 'Beijing' FROM DUAL;
输出:
\n SAL_DIFFERENCE_IGNORE_TIES | SAL_DIFFERENCE_WITH_TIES\n -------------------------: | -----------------------:\n 1000 | 0\n
或者,如果您想要所有部门:
SELECT deptno,
MAX( CASE WHEN sal_rank = 1 THEN sal END )
- MAX( CASE WHEN sal_rank = 2 THEN sal END ) AS sal_difference_ignore_ties,
MAX( CASE WHEN sal_rownum = 1 THEN sal END )
- MAX( CASE WHEN sal_rownum = 2 THEN sal END ) AS sal_difference_with_ties
FROM (
SELECT e.deptno,
e.sal,
DENSE_RANK() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rank,
ROW_NUMBER() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rownum
FROM emp e
INNER JOIN dept d
ON ( e.deptno = d.deptno )
)
GROUP BY deptno;SELECT deptno,
MAX( CASE WHEN sal_rank = 1 THEN sal END )
- MAX( CASE WHEN sal_rank = 2 THEN sal END ) AS sal_difference_ignore_ties,
MAX( CASE WHEN sal_rownum = 1 THEN sal END )
- MAX( CASE WHEN sal_rownum = 2 THEN sal END ) AS sal_difference_with_ties
FROM (
SELECT e.deptno,
e.sal,
DENSE_RANK() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rank,
ROW_NUMBER() OVER ( PARTITION BY e.deptno ORDER BY e.sal DESC ) AS sal_rownum
FROM emp e
INNER JOIN dept d
ON ( e.deptno = d.deptno )
)
GROUP BY deptno;
哪些输出:
\n德普诺 | SAL_DIFFERENCE_IGNORE_TIES | SAL_DIFFERENCE_WITH_TIES\n -----: | -------------------------: | -----------------------:\n 1 | 1000 | 0\n 2 | 500 | 500\n
db<> 在这里摆弄
这个怎么样?
基于 Scott 的 EMP 表:
SQL> select ename, sal
2 from emp
3 order by sal desc;
ENAME SAL
---------- ----------
KING 5001 --> highest salary
FORD 3000 --> Ford and Scott share the
SCOTT 3000 --> 2nd highest salary
JONES 2975
BLAKE 2850
CLARK 2450
ALLEN 1600
TURNER 1500
MILLER 1300
WARD 1250
MARTIN 1250
ADAMS 1100
SMITH 1000
JAMES 950
14 rows selected.
然后你对他们进行排名并 - 使用LISTAGG
(显示共享相同最高或第二高工资的所有员工) - 得到最终结果:
SQL> with temp as
2 (select e.ename,
3 e.sal,
4 dense_rank() over (order by e.sal desc) rnk,
5 d.dname
6 from emp e join dept d on d.deptno = e.deptno
7 )
8 select listagg(case when rnk = 1 then ename ||' - '|| dname || ' ($' || sal ||')' end, ', ')
9 within group (order by ename) highest,
10 --
11 listagg(case when rnk = 2 then ename ||' - '|| dname || ' ($' || sal ||')' end, ', ')
12 within group (order by ename) second_highest,
13 --
14 max(case when rnk = 1 then sal end) -
15 max(case when rnk = 2 then sal end) diff
16 from temp t
17 where t.rnk in (1, 2);
HIGHEST SECOND_HIGHEST DIFF
------------------------------ -------------------------------------------------- ----------
KING - ACCOUNTING ($5001) FORD - RESEARCH ($3000), SCOTT - RESEARCH ($3000) 2001
SQL>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.