给出一个表Employees
+-------+--------+-----------+------+-----------+------+------+--------+
| EMPNO | ENAME | JOB | MGR | HIREDATE | SAL | COMM | DEPTNO |
+-------+--------+-----------+------+-----------+------+------+--------+
| 7369 | SMITH | CLERK | 7902 | 17-Dec-80 | 800 | | 20 |
| 7499 | ALLEN | SALESMAN | 7698 | 20-Feb-81 | 1600 | 300 | 30 |
| 7521 | WARD | SALESMAN | 7698 | 22-Feb-81 | 1250 | 500 | 30 |
| 7566 | JONES | MANAGER | 7839 | 02-Apr-81 | 2975 | | 20 |
| 7654 | MARTIN | SALESMAN | 7698 | 28-Sep-81 | 1250 | 1400 | 30 |
| 7698 | BLAKE | MANAGER | 7839 | 01-May-81 | 2850 | | 30 |
| 7782 | CLARK | MANAGER | 7839 | 09-Jun-81 | 2450 | | 10 |
| 7788 | SCOTT | ANALYST | 7566 | 19-Apr-87 | 3000 | | 20 |
| 7839 | KING | PRESIDENT | null | 17-Nov-81 | 5000 | | 10 |
| 7844 | TURNER | SALESMAN | 7698 | 08-Sep-81 | 1500 | 0 | 30 |
| 7876 | ADAMS | CLERK | 7788 | 23-May-87 | 1100 | | 20 |
| 7900 | JAMES | CLERK | 7698 | 03-Dec-81 | 950 | | 30 |
| 7902 | FORD | ANALYST | 7566 | 03-Dec-81 | 3000 | | 20 |
| 7934 | MILLER | CLERK | 7782 | 23-Jan-82 | 1300 | | 10 |
+-------+--------+-----------+------+-----------+------+------+--------+
另一张表Departments
+--------+------------+----------+
| DEPTNO | DNAME | LOC |
+--------+------------+----------+
| 10 | ACCOUNTING | NEW YORK |
| 20 | RESEARCH | DALLAS |
| 30 | SALES | CHICAGO |
| 40 | OPERATIONS | BOSTON |
+--------+------------+----------+
如何找到每个部门的最高工资?
输出格式行为:
DEPTNO,ENAME,DNAME,SAL,LOC
答案 0 :(得分:3)
如果您想与员工一起找到最高薪水,请使用ANSI标准row_number()
功能:
select d.deptno, e.ename, d.dname, e.sal, d.loc
from (select e.*, row_number() over (partition by deptno order by sal desc) as seqnum
from employees e
) e join
departments d
on e.deptno = d.deptno
where seqnum = 1
答案 1 :(得分:3)
您可以使用将为每个部门获取max(salary)
的子查询:
select de.deptno,
e.ename,
de.dname,
e.sal,
de.loc
from employees e
inner join
(
select max(e.sal) MaxSalary, d.deptno, d.loc, d.dname
from employees e
inner join departments d
on e.deptno = d.deptno
group by d.deptno, d.loc, d.dname
) de
on e.sal = de.MaxSalary
and e.deptno = de.deptno
order by de.deptno
见SQL Fiddle with Demo。您会注意到这会为deptno=20
返回2行,因为有两个员工具有相同的薪水。
如果您使用的是具有窗口功能的数据库,那么您将需要使用dense_rank()
,这样您将返回所有在每个部门拥有最高薪水的员工:
select d.deptno, e.ename, d.dname, e.sal, d.loc
from
(
select e.ename,
e.sal,
e.deptno,
dense_rank() over (partition by deptno order by sal desc) as salRank
from employees e
) e
inner join departments d
on e.deptno = d.deptno
where salRank = 1;
两个版本的结果是:
| DEPTNO | ENAME | DNAME | SAL | LOC |
-------------------------------------------------
| 10 | KING | ACCOUNTING | 5000 | NEW YORK |
| 20 | SCOTT | RESEARCH | 3000 | DALLAS |
| 20 | FORD | RESEARCH | 3000 | DALLAS |
| 30 | BLAKE | SALES | 2850 | CHICAGO |