【牛客SQL】SQL12 获取每个部门中当前员工薪水最高的相关信息

327 阅读2分钟

题目描述

在这里插入图片描述

描述 有一个员工表dept_emp简况如下:

在这里插入图片描述

有一个薪水表salaries简况如下:

在这里插入图片描述

获取每个部门中当前员工薪水最高的相关信息,给出dept_no, emp_no以及其对应的salary,按照部门编号升序排列,以上例子输出如下: (注意: Mysql与Sqlite select 非聚合列的结果可能不一样)

在这里插入图片描述

题解

题眼是要求同一个部门里的最高工资(按照部门号码升序展示)。

但是部门信息在表dept_emp,工资信息在表salaries,也就是说重要信息被分散在两张表中,两张表中能区分数据共有信息就是员工编号emp_no,怎么办?

最简单的想法就是,先把两张表中的部门信息和工资信息合为一张表,叫做new_table:

(式一)

SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_emp d1 JOIN salaries s1
ON d1.emp_no == s1.emp_no 
AND d1.to_date = '9999-01-01' AND s1.to_date = '9999-01-01'

ORDER BY d1.dept_no;

合为一张表了之后再去找,就简化了,我们假设这张表叫做new_table,此时这张表new_table里有: 部门号dept_no,员工号emp_no,工资salary。我们需要把同一个部门中最高工资的员工信息取出,其他不要,可以有:

(式二)

SELECT dept_no, emp_no, salary FROM new_table
AND to_date = '9999-01-01'
WHERE salary IN (
    SELECT MAX(salary) FROM new_table
    AND to_date = '9999-01-01'
)
ORDER BY dept_no;

这就做完了,但是这里的new_table是我们自己假设的,实际上的new_table本身是两张表的合并(见上上个代码块),我们联立式一,式二,将new_table展开可以有:

(式三)

SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_emp d1 JOIN salaries s1
ON d1.emp_no == s1.emp_no 
AND d1.to_date = '9999-01-01' AND s1.to_date = '9999-01-01'
WHERE s1.salary IN (
    SELECT MAX(s2.salary) FROM dept_emp d2 JOIN salaries s2
    ON d2.emp_no == s2.emp_no 
    AND d2.to_date = '9999-01-01' AND s2.to_date = '9999-01-01'
)
ORDER BY d1.dept_no;

由于WHERE连接的两张大表本身各自是由两张小表合并的,d1和s1是对齐了,d2和s2是对齐了,但是d1和s1 与d2和s2还没对齐,所以再按照部门信息取相等进行对齐即可WHERE d1.dept_no == d2.dept_no

SELECT d1.dept_no, d1.emp_no, s1.salary FROM dept_emp d1 JOIN salaries s1
ON d1.emp_no == s1.emp_no 
AND d1.to_date = '9999-01-01' AND s1.to_date = '9999-01-01'
WHERE s1.salary IN (
    SELECT MAX(s2.salary) FROM dept_emp d2 JOIN salaries s2
    ON d2.emp_no == s2.emp_no 
    AND d2.to_date = '9999-01-01' AND s2.to_date = '9999-01-01'
    WHERE d1.dept_no == d2.dept_no 
)
ORDER BY d1.dept_no;