LeetCode:Department Top Three Salaries -各部门工资最高的三人

1、题目名称

Department Top Three Salaries(各部门工资最高的三个人)

2、题目地址

https://leetcode.com/problems/department-top-three-salaries/

3、题目内容

表Employee保存了所有雇员的数据,每名雇员都有一个Id,和一个部门Id(DepartmentId)

+----+-------+--------+--------------+
| Id | Name  | Salary | DepartmentId |
+----+-------+--------+--------------+
| 1  | Joe   | 70000  | 1            |
| 2  | Henry | 80000  | 2            |
| 3  | Sam   | 60000  | 2            |
| 4  | Max   | 90000  | 1            |
| 5  | Janet | 69000  | 1            |
| 6  | Randy | 85000  | 1            |
+----+-------+--------+--------------+

表Department保存了每个部门的Id和名称

+----+----------+
| Id | Name     |
+----+----------+
| 1  | IT       |
| 2  | Sales    |
+----+----------+

现需要写一个SQL,找出每个部门工资最高的三名雇员。例如以上面的两张表的数据,查询出的结果集应该是这样的:

+------------+----------+--------+
| Department | Employee | Salary |
+------------+----------+--------+
| IT         | Max      | 90000  |
| IT         | Randy    | 85000  |
| IT         | Joe      | 70000  |
| Sales      | Henry    | 80000  |
| Sales      | Sam      | 60000  |
+------------+----------+--------+

4、初始化数据库脚本

在MySQL数据库中建立一个名为LEETCODE的数据库,用MySQL命令行中的source命令执行下面脚本:

-- 执行脚本前必须建立名为LEETCODE的DATABASE
USE LEETCODE;

DROP TABLE IF EXISTS Employee;
CREATE TABLE Employee (
  Id INT NOT NULL PRIMARY KEY,
  Name VARCHAR(10),
  Salary INT,
  DepartmentId INT
);

INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (1, 'JID', 70000, 1);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (2, 'KAT', 80000, 2);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (3, 'FCK', 60000, 2);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (4, 'DIR', 90000, 1);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (5, 'CAT', 69000, 1);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (6, 'DOT', 85000, 1);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (7, 'GOS', 25000, 1);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (8, 'OPA', 90000, 2);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (9, 'OPB', 30000, 2);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (10, 'DIK', 30000, 3);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (11, 'POD', 30000, 3);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (12, 'SUV', 30000, 3);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (13, 'ABC', 30000, 3);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (15, 'WKK', 75000, 4);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (16, 'JYY', 60000, 4);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (17, 'XWY', 60000, 4);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (18, 'KMT', 55000, 4);
INSERT INTO Employee (Id, Name, Salary, DepartmentId) VALUES (14, 'LXK', 90000, 999);

DROP TABLE IF EXISTS Department;
CREATE TABLE Department (
  Id INT NOT NULL PRIMARY KEY,
  Name VARCHAR(10)
);

INSERT INTO Department (Id, Name) VALUES (1, 'DPRT1');
INSERT INTO Department (Id, Name) VALUES (2, 'DPRT2');
INSERT INTO Department (Id, Name) VALUES (3, 'DPRT3');
INSERT INTO Department (Id, Name) VALUES (4, 'DPRT4');

5、解题SQL

先写一个SQL,查询出每个有部门的人的部门和工资

SELECT D.NAME Dep, E.NAME Emp, E.Salary Sal
FROM Employee E
LEFT JOIN Department D ON E.DepartmentId = D.Id
WHERE D.NAME IS NOT NULL
使用 MySQL Query Browser 工具查询结果如下:

根据这个SQL,可以继续写出一个查询出每个部门工资处于前三名位置的员工列表:

SELECT A.Dep Department, A.Emp Employee, A.Sal Salary
FROM   (SELECT D.NAME Dep, E.NAME Emp, E.Salary Sal
        FROM   Employee E
        LEFT   JOIN Department D ON E.DepartmentId = D.Id
        WHERE  D.NAME IS NOT NULL) A
WHERE  (SELECT COUNT(*)
        FROM   (SELECT D.NAME Dep, E.NAME Emp, E.Salary Sal
                FROM   Employee E
                LEFT   JOIN Department D ON E.DepartmentId = D.Id
                WHERE  D.NAME IS NOT NULL) B
        WHERE  A.Dep = B.Dep AND
               A.Sal < B.Sal) < 3
ORDER  BY A.Dep ASC, A.Sal DESC

这个SQL的查询结果集如下:

可以看到,部门4(DPRT4)有四个人,一个高工资(WKK,75000),一个低工资(KMT,55000),其他两个人工资(JYY,XWY,60000)是一样的。按照上面的SQL,会查出该部门工资最高的三个人是WKK、JYY、XWY,我认为这是一种合理的结果,即:

查出每个部门工资排名最靠前的三个人,如有多于三人工资并列第一则将这些人都查出,如有多于两人工资并列第二则查出排名第一的人和这些并列第二的人,如有多于一人工资并列第三则查出排名第一、二名的人和所有并列第三名的人。

但这种类似计算长跑比赛前三名的算法却并不是本题的“正确答案”,本题实际上要我们找的并不是要你求出每个部门工资最高的三个人,而是要:

先求出每个部门第三高的工资,再求出该部门工资数不小于第三高工资的所有雇员。

虽然我认为这是不合理的答案,不过还是写了一个“正确”的SQL如下:

SELECT A.Dep Department, A.Emp Employee, A.Sal Salary
FROM   (SELECT D.NAME Dep, E.NAME Emp, E.Salary Sal
        FROM   Employee E
        LEFT   JOIN Department D ON E.DepartmentId = D.Id
        WHERE  D.NAME IS NOT NULL) A
WHERE  (SELECT COUNT(DISTINCT Sal)
        FROM   (SELECT D.NAME Dep, E.NAME Emp, E.Salary Sal
                FROM   Employee E
                LEFT   JOIN Department D ON E.DepartmentId = D.Id
                WHERE  D.NAME IS NOT NULL) B
        WHERE  A.Dep = B.Dep AND
               A.Sal < B.Sal) < 3
ORDER  BY A.Dep ASC, A.Sal DESC

查询出的结果集如下:

另一种更简单的SQL写法如下,查询结果集与上同:

SELECT D.NAME Department, E.NAME Employee, E.Salary Salary
FROM   Department D, Employee E
WHERE  E.DepartmentId = D.Id AND
       (SELECT COUNT(DISTINCT Salary)
        FROM   Employee
        WHERE  DepartmentId = D.Id AND
               Salary > E.Salary) < 3
END
时间: 2024-10-27 12:59:02

LeetCode:Department Top Three Salaries -各部门工资最高的三人的相关文章

东芝将在家电和半导体等部门裁员约1万人

2月4日消息,据共同社报道,东芝公司4日宣布调降2015财年业绩预期,净亏损预期从此前的5500亿日元扩大至7100亿日元(约合人民币396亿元).受财务造假丑闻影响,东芝的盈利能力严重下滑,本已处在历史最差水平的巨额亏损仍将进一步扩大.东芝将在家电和半导体等部门裁员约1万人,电脑及白色家电业务正在寻求与其他公司的业务整合. 东芝去年12月发布财年预亏公告,在短短1个多月后被迫再次下调业绩.继2014财年净亏损378亿日元后,东芝将连续2年陷入亏损泥潭. 同时公布的2015年4-12月业绩从上年

全球20大都市收入对比:北京最低工资倒数第三

环球网于2月20日-3月20日期间发动二十余位驻外记者,在全球20个主要城市展开对食品.交通.教育及生活日用类40余项的物价调查.在前几日陆续推出的报道中,"北京http://www.aliyun.com/zixun/aggregation/32047.html">食品价格.水.电价列于'中低价阵营'.纽约.莫斯科.台北.温哥华油价都比北京要低"等调查结果引起了网友们的激辩. 在系列调查的最后一篇调查中,环球网还对比了全球20城小时工的收入水平及20城居民的最低工资标准

盘点那些工资高的让人流泪的奇葩工作

如今这个社会,奇葩职业可以说是年年有,而且每年其实都特多.实际上,随着行业细分越来越多元化,许多稀奇古怪的奇葩职业现在也是层出不穷.而只要你在社会上找准自己的位置,那肯定会有"一款"职业是属于你的.本文中收集了一些奇葩但是高薪的职业和大家一起分享,希望能给大家在找工作的时候带来一点启示. 草泥马来了!!真的是草泥马!!它又来了!! 在最近,北京某大会出来站台上又出现了草泥马的身影,而且草泥马的一天站台费都有3000多人民币! 当这条消息报道出来的时候,瞬间就引爆了网友的吐槽,有些人辛辛

南京社保部门称摩托罗拉南京裁人未获批准

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 摩托罗拉移动在中国陷入裁员风波. 中新网南京8月28日电(卢辉 曹韧基)27日下午,记者从南京人力资源和社会保障局获悉,摩托罗拉南京研究中心(以下简称"南摩")裁员500多名员工的备案,暂时没有获得批准."南摩"一位员工代表透露,摩托罗拉亚太总裁刘飞已经抵达南京,28日将与"南摩"劳

LeetCode All in One 题目讲解汇总(持续更新中...)

终于将LeetCode的免费题刷完了,真是漫长的第一遍啊,估计很多题都忘的差不多了,这次开个题目汇总贴,并附上每道题目的解题连接,方便之后查阅吧~ 如果各位看官们,大神们发现了任何错误,或是代码无法通过OJ,或是有更好的解法,或是有任何疑问,意见和建议的话,请一定要在对应的帖子下面评论区留言告知博主啊,多谢多谢,祝大家刷得愉快,刷得精彩,刷出美好未来- 博主制作了一款iOS的应用"Leetcode Meet Me",里面有Leetcode上所有的题目,并且贴上了博主的解法,随时随地都能

【书评:Oracle查询优化改写】第五至十三章

[书评:Oracle查询优化改写]第五至十三章 一.1  BLOG文档结构图       一.2  前言部分   一.2.1  导读 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 字符串的处理 ② 常用分析函数 ③ 用sql输出九九乘法表     本文如有错误或不完善的地方请大家多多指正,ITPUB留言或QQ皆可,您的批评指正是我写作的最大动力.     一.2.2  实验环境介绍   oracle 11g   一.2.3  相关

重庆酉阳发GPS手机全天候监管官员行踪

4月7日,酉阳督查巡察办工作人员在随机抽打电话.<重庆商报>供图 重庆酉阳发GPS手机监管官员8小时外的生活,要求他们24小时开机,接受跟踪监督,购机费和通话费按相关规定由县财政统一支付.实施此种办法一年来,该县共有82名领导干部因各种原因被通报批评. 出台政策 24小时定位官员行踪 党政主要领导干部8小时外的生活如何监管?重庆酉阳县的做法是,给他们每人发放一部具有GPS定位功能的3G手机,要求他们24小时开机,接受跟踪监督,购机费和通话费按相关规定由县财政统一支付.如果在跟踪中发现他们有违规

oracl数据库sql语句怎么查询工资最低的两名员工编号,姓名,工资等信息。

问题描述 oracl数据库sql语句怎么查询工资最低的两名员工编号,姓名,工资等信息. 查询每个部门工资最低的两个员工编号,姓名,工资,等信息.关键是工资最低的两名员工 解决方案 SELECT * FROM ( SELECT bumen, price, ROW_NUMBER () OVER ( PARTITION BY bumen ORDER BY bumen, price DESC ) rn FROM table1 WHERE bumen IN ( SELECT bumen FROM tabl

大帮手人事/考勤/计件/工资/验厂软件免费下载试用

问题描述 试用版下载地址:http://www.helpersoft.cn/download/hrm_disk.zip大帮手人力资源管理系统(HelperHRMS)是一款操作人性化.设计精致.功能齐全的人力资源管理系统,可全面解决人事管理.考勤管理.计件工资.薪资核算.客户验厂等问题,系统具备以下主要及独创的功能特点:系统概况:(1)采用MicrsoftSQLServer2000/2005大型数据库,满足多用户/多账套使用和海量数据管理的需要.(2)个性化报表:所有打印报表均可自由设计,满足个性