mysql - 如何同时从每个部门检索前 3 名最高薪和前 3 名最低薪
问题描述
我想知道是否可以使用 sql oracle 或 mysql 在输出中并排显示每个部门的前 3 名最高薪员工与同一部门的最低 3 名薪水员工。我尝试使用分析函数和相关子查询方法,但只能获得最高或最低,但不能同时获得两者。对此的任何见解都会受到赞赏。
DDL 和 DML:
CREATE TABLE "EMP" ( "EMPNO" NUMBER(4,0),"ENAME" VARCHAR2(10 BYTE),"JOB" VARCHAR2(9 BYTE),"MGR" NUMBER(4,
0),"HIREDATE" DATE,"SAL" NUMBER(7,2),"COMM" NUMBER(7,2),"DEPTNO" NUMBER(2,0),CONSTRAINT "PK_EMP" PRIMARY KEY
( "EMPNO" )
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7839,'KING','PRESIDENT',null,to_date('17-11-81','DD-MM-RR'),5000,null,10);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (8967,'SCOTT','ANALYST',7566,to_date('27-12-19','DD-MM-RR'),3000,null,10);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7782,'CLARK','MANAGER',7839,to_date('09-06-81','DD-MM-RR'),2450,null,10);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7934,'MILLER','CLERK',7782,to_date('23-01-82','DD-MM-RR'),1300,null,10);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7902,'FORD','ANALYST',7566,to_date('03-12-81','DD-MM-RR'),3000,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (8900,'SCOTT','ANALYST',7566,to_date('27-12-19','DD-MM-RR'),3000,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7788,'SCOTT','ANALYST',7566,to_date('19-04-87','DD-MM-RR'),3000,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7566,'JONES','MANAGER',7839,to_date('02-04-81','DD-MM-RR'),2975,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7876,'ADAMS','CLERK',7788,to_date('23-05-87','DD-MM-RR'),1100,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7369,'SMITH','CLERK',7902,to_date('17-12-80','DD-MM-RR'),800,null,20);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7698,'BLAKE','MANAGER',7839,to_date('01-05-81','DD-MM-RR'),2850,null,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7499,'ALLEN','SALESMAN',7698,to_date('20-02-81','DD-MM-RR'),1600,null,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7844,'TURNER','SALESMAN',7698,to_date('08-09-81','DD-MM-RR'),1500,null,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7654,'MARTIN','SALESMAN',7698,to_date('28-09-81','DD-MM-RR'),1250,null,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7521,'WARD','SALESMAN',7698,to_date('22-02-81','DD-MM-RR'),1250,null,30);
Insert into EMP (EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO) values (7900,'JAMES','CLERK',7698,to_date('03-12-81','DD-MM-RR'),950,null,30);
解决方案
一种解决方案是:
WITH t AS
(SELECT e.*,
DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY sal DESC) AS sal_desc,
DENSE_RANK() OVER (PARTITION BY DEPTNO ORDER BY sal ASC) AS sal_ASC
FROM EMP e)
SELECT *
FROM t
WHERE sal_desc <= 3 OR sal_ASC <= 3
推荐阅读
- postgresql - 有条件地选择要在 FOR LOOP 中迭代的集合
- java - 在不使用 .setFileSelectionMode 的情况下限制 JFileChooser 的允许选择
- javafx - 如何制作具有多个下拉菜单的组合框?
- julia - 在 Julia,如果我删除!字典中的键和值,它会重新分配字典吗?
- amazon-web-services - 如何在 aws cli describe-instances 输出中获取标签的值?
- javascript - jquery 出现错误,说明“idleTimeout 不是函数”
- javascript - 从 JS 类解析异步值
- loops - 循环通过库存不运行它告诉什么?
- html - Chrome 相关链接 PDF
- python - Python:在元组中过滤