良心正确答案

获取每个部门中当前员工薪水最高的相关信息

http://www.nowcoder.com/questionTerminal/4a052e3e1df5435880d4353eb18a91c6

【良心正确答案】

/* 其实这种题目有时需求不明确,官方给的数据也不太好验证答案,故可以自己修改或增加数据进行验证 */

/* 我的数据库是mysql8.0 */

创建表和插入数据:

CREATE TABLE dept_emp (
emp_no int(11) NOT NULL,
dept_no char(4) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,dept_no));
CREATE TABLE salaries (
emp_no int(11) NOT NULL,
salary int(11) NOT NULL,
from_date date NOT NULL,
to_date date NOT NULL,
PRIMARY KEY (emp_no,from_date));

INSERT INTO salaries VALUES (10001, 90000, '1986-06-26', '1987-06-26');
INSERT INTO salaries VALUES (10001, 95000, '2002-06-22', '9999-01-01');
INSERT INTO salaries VALUES (10002, 72527, '1996-08-03', '1997-08-03');
INSERT INTO salaries VALUES (10002, 72527, '2000-08-02', '2001-08-02');
INSERT INTO salaries VALUES (10002, 95000, '2001-08-02', '9999-01-01');
INSERT INTO salaries VALUES (10003, 90000, '1996-08-03', '1997-08-03');
INSERT INTO salaries VALUES (10004, 80000, '1996-01-01', '1996-03-01');
INSERT INTO salaries VALUES (10004, 89000, '1996-08-08', '9999-01-01');

INSERT INTO dept_emp VALUES (10001, 'd001', '1986-06-26', '9999-01-01');
INSERT INTO dept_emp VALUES (10002, 'd001', '1996-08-03', '9999-01-01');
INSERT INTO dept_emp VALUES (10003, 'd001', '1996-08-03', '1997-08-03');
INSERT INTO dept_emp VALUES (10004, 'd002', '1996-08-08', '9999-01-01');

OK,到这里可以分析一下题目了,考虑周全一点(有多个部门且同个部门有相同最高薪水),分为2种需求。
1、查询各个部门的最高薪水的员工信息
2、查询所有部门中最高薪水的员工信息
3、若不用emp_no,只要dept_no,salary,这个就简单了,分组即可。(其实不想说的,算了,后面直接给代码吧,不解析了)

【需求1】

sql代码:
select de.dept_no, emp_no, max_salary

FROM dept_emp de

join

(

select dept_no, max(salary) as max_salary

FROM salaries s

join dept_emp de on s.emp_no = de.emp_no

where s.to_date = '9999-01-01' and de.to_date = '9999-01-01'

group by dept_no

) t on de.dept_no = t.dept_no

where de.to_date = '9999-01-01'

解析:
(1)表t得到各个部门最高薪水
(2)连接dept_emp表,获取emp_no即可。(这样就可以把同部门最高的薪水的多个员工都列出来了)

【需求2】
sql代码:
select *

FROM salaries

where salary =

(

select max(max_salary) from

(

    select dept_no, max(salary) as max_salary

    FROM salaries s

    join dept_emp de on s.emp_no = de.emp_no

    where s.to_date = '9999-01-01' and de.to_date = '9999-01-01'

    group by dept_no

)t

)

解析:
(1)表t得到各个部门最高薪水
(2)然后再取最高薪水,即所有部门中最高薪水(跟需求1相比,也就多了这一步)
(3)最后连接dept_emp表,获取emp_no即可。(这样就可以把同部门最高的薪水的多个员工都列出来了)

【需求3】
sql代码:
select dept_no, max(salary)

from dept_emp as de

join salaries as s

on de.emp_no = s.emp_no

and de.to_date='9999-01-01'

and s.to_date='9999-01-01'

group by dept_no

试试吧,有用请良心点赞,顶上去!!!

全部评论
兄弟,逻辑通了吗
3 回复 分享
发布于 2021-02-24 15:19
见【讨论】,有图片
2 回复 分享
发布于 2020-11-24 01:58
需求1,你这样写是有问题的吧,并没有salary字段匹配
2 回复 分享
发布于 2021-01-29 17:04
你自己运行一下 谢谢
2 回复 分享
发布于 2021-09-17 11:12
楼主,我有个小问题,需求一中,最后一行的 ‘where de.to_date = '9999-01-01'这个不加也可以吧,子表查询的结果应该就限定了to_date。求解
1 回复 分享
发布于 2021-06-03 17:25
需求一的代码感觉不太对,得到各部门最高工资之后,如果内连接的是dept_emp表,那么部门内所有员工的工资都会变成max_salary输出,个人感觉是不是应该内连接到salary表来查找最高工资的员工。
1 回复 分享
发布于 2021-06-12 12:31
又臭又长
1 回复 分享
发布于 2021-07-11 00:27
不对
1 回复 分享
发布于 2022-04-12 13:14
真可怕,没治了
1 回复 分享
发布于 2022-06-02 14:50
<where and="" de&#46;to&#95;date="9999&#45;01&#45;01" s&#46;to&#95;date="9999&#45;01&#45;01">这一句是为什么啊?</where>
点赞 回复 分享
发布于 2021-04-29 19:47
方法一是错误的
点赞 回复 分享
发布于 2021-05-12 19:39
你这方法一直接把所有员工的工资全变成最高工资输出了
点赞 回复 分享
发布于 2021-05-13 01:45

相关推荐

牛客339922477号:都不用reverse,直接-1。一行。啥送分题
点赞 评论 收藏
分享
70 收藏 评论
分享
牛客网
牛客企业服务