LeetCode Database

LeetCode Database

这次的两个题目涉及比较关系,mysql中求取某一属性的最大值,可以使用聚合函数max()。如果求第二大值,可以求取小于最大值的最大值。如果是第三大、第四大甚至第五大值之时,就不能像这样循环地定义。下面这道题给出了一个不同的思路。

Department Top Three Salaries

题目

给定如下一个关系Employee,求每个部门前三高的薪水和雇员,相等的薪水排在同一位。

1
2
3
4
5
6
7
8
9
10
11
12

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

解答

第三高的薪水,意味着排在其前面的不同的薪水只有两个。给定两个Employee关系e1e2,对于e1中的每个条目,我们只需统计e2中与其相同部门且薪水比它大的不同薪水的数目,该数目为2则e1的对应条目为所求。同时第二高和第一高的薪水,该数目分别为1和0。

mysql语句如下

1
2
3
4
5
6
7
8
9
10

select name, salary, departmentID
from Employee as e1
where 2 >= (
select count( distinct e2.salary)
from Employee as e2
where e2.departmentID = e1.departmentID and
e2.salary > e1.salary
)
;

另一个题目是关于多个连续条目的问题。

Human Traffic of Stadium

题目

给定如下一个关系Stadium,求出那些连续三天及以上人数不低于100的条目。

1
2
3
4
5
6
7
8
9
10
11
12
13

+------+------------+-----------+
| id | visit_date | people |
+------+------------+-----------+
| 1 | 2017-01-01 | 10 |
| 2 | 2017-01-02 | 109 |
| 3 | 2017-01-03 | 150 |
| 4 | 2017-01-04 | 99 |
| 5 | 2017-01-05 | 145 |
| 6 | 2017-01-06 | 1455 |
| 7 | 2017-01-07 | 199 |
| 8 | 2017-01-08 | 188 |
+------+------------+-----------+

解答

由表中可知,日期和id都是连续的,我们只需找出id连续3个及以上的即可。连续三天及以上意味着条目满足下面三个条件之一:

  1. 该条目和下个相邻条目和下下个相邻条目都是不少于100人
  2. 该条目和上个相邻条目和下个相邻条目都是不少于100人
  3. 该条目和上个相邻条目和上上个相邻条目都是不少于100人

这些可以用id之间的差距来表示。
我们可以求出三个Stadium关系t1t2t3的笛卡尔积,求出其中三个人数都不少于100,且id满足上述条件的条目,取出其中t1的属性,排序即可。

1
2
3
4
5
6
7
8
9
10
11
12

select distinct t1.* from stadium as t1, stadium as t2, stadium as t3
where t1.people >= 100 and t2.people >= 100 and t3.people >= 100
and
(
(t1.id = t2.id - 1 and t1.id = t3.id - 2)
or
(t1.id = t2.id + 1 and t1.id = t3.id + 2)
or
(t1.id = t2.id - 1 and t1.id = t3.id + 1)
)
order by t1.id;
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×