185. Department Top Three Salaries
2017-09-01 18:17
330 查看
题目:
表Employee有所有员工信息,包括Id,薪水和所属部门Id。
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 | Name |
---|---|
1 | IT |
2 | Sales |
例如:
Department | Employee | Salary |
---|---|---|
IT | Max | 90000 |
IT | Randy | 85000 |
IT | Joe | 70000 |
Sales | Henry | 80000 |
Sales | Sam | 60000 |
解析:
题中有两张表,第一步先连接。select dd.Name as Department, ee.Name as Employee, ee.Salary as Salary from Employee ee, Department dd where ee.DepartmentId =dd.id ...
用
as标注出正确的表头。
接下来是条件部分,本题虽然看上去有分组(按部门分组取前三)但是如果使用
group by取前三的操作其实很困难,使用
group by后的排列顺去很难控制,因此在这里可以使用一个巧妙地方法,该方法同样适用于“找出最高(低)的前n项”一类问题。
( select count(distinct ee2.salary) from employee ee2 where ee.DepartmentId=ee2.DepartmentId and ee.salary<ee2.salary )<=2
思路为,将employee做自连接。注意这里的连接方式,
ee.DepartmentId=ee2.DepartmentId,这样连接后两个表中的数据行并不是一对一的关系,原因在于
DepartmentId重复多个,并没有唯一标识。这样做每一个员工分别和其同部门的所有员工组成多个数据行。
拿个别的例子:
name | sex | age | tel | name | sex | age | tel |
---|---|---|---|---|---|---|---|
周周 | 男 | 30 | 17754585545 | 周周 | 男 | 30 | 17754585545 |
张三 | 男 | 54 | 11012121122 | 周周 | 男 | 30 | 17754585545 |
王五 | 男 | 18 | 17722454565 | 周周 | 男 | 30 | 17754585545 |
赵六 | 男 | 18 | 18922454565 | 周周 | 男 | 30 | 17754585545 |
孙七 | 女 | 30 | 10522454565 | 孙七 | 女 | 30 | 10522454565 |
李四 | 女 | 20 | 13522454565 | 孙七 | 女 | 30 | 10522454565 |
周周和其他所有男人分别组成了4行数据。
这是连接表的方式,检索的方式则是
ee.salary<ee2.salary。
当我们拿到形如上个例子那样的表后,每一类下的大小就很容易比较了(因为已经有了同类之间所有组合的数据行了)。
如果某个
ee.salary员工的薪水是同类最高的,那么在经过
ee.salary<ee2.salary
这样的比较后会发现,并不存在某一个员工他的薪水比这个最高薪水还要高的,那么在
select count()获取到的总数即为0。
同样,如果员工薪水是次高的,那么只会有一个人的薪水比他高,因此
select count()获取到的数为1。
不难看出第三高薪水的员工最后计数则为2。
因此,只要是
select count()计数小于等于2的都是前三高的数。
注意:这里要注意的是实际使用中使用的是
select count(distinct salary)主要是因为salary相同的排名并列。因此,前三高的数并不只有3个,有可能是4个(有两个薪水并列)或者更多。
综上所述,最终的SQL查找语句为:
select dd.Name as Department, ee.Name as Employee, ee.Salary as Salary from Employee ee, Department dd where ee.DepartmentId =dd.id and ( select count(distinct ee2.salary) from employee ee2 where ee.DepartmentId=ee2.DepartmentId and ee.salary<ee2.salary )<=2
相关文章推荐
- 185. Department Top Three Salaries
- 185. Department Top Three Salaries
- LeetCode_OJ【185】Department Top Three Salaries
- leetcode185 Department Top Three Salaries
- leetcode185 Department Top Three Salaries
- 185. Department Top Three Salaries
- leetcode 184,185 Department Top Three Salaries/HIGHEST Salaries
- Department Top Three Salaries
- Department Top Three Salaries
- [LeetCode]-DataBase-Department Top Three Salaries
- [LeetCode][SQL]Department Top Three Salaries
- 【LeetCode】Department Highest Salary && Department Top Three Salaries
- 题目9:MySQL---------Department Top Three Salaries
- [LeetCode] Department Top Three Salaries 系里前三高薪水
- Department Top Three Salaries
- LeetCode | database | Department Top Three Salaries
- LeetCode Department Top Three Salaries
- leetcode数据库sql之Department Top Three Salaries
- [LeetCode][Database]Department Top Three Salaries
- [leetcode] Department Top Three Salaries