力扣(LeetCode)刷题

力扣(LeetCode)

1、编写一个 SQL 查询,查找所有至少连续出现三次的数字。

+----+-----+
| Id | Num |
+----+-----+
| 1  |  1  |
| 2  |  1  |
| 3  |  1  |
| 4  |  2  |
| 5  |  1  |
| 6  |  2  |
| 7  |  2  |
+----+-----+


例如,给定上面的 Logs 表, 1 是唯一连续出现至少三次的数字。

+-----------------+
| ConsecutiveNums |
+-----------------+
| 1               |
+-----------------+

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/consecutive-numbers

SELECT DISTINCT
	s.Num AS ConsecutiveNums 
FROM
	LOGS s
	JOIN LOGS b ON ( 
    s.Num = b.Num 
	AND b.Id >= s.Id - 2 
	AND b.Id <= s.Id ) 
GROUP BY
	s.Id 
HAVING
	count( * ) >=3

1)首先进行了双表连接,双表连接的条件是:id值的相差范围是0到2,而且Num相同;

2)然后从join表中选择出Num和Num出现的次数;

3)最后外层查询再从中选择出次数大于等于3的Num;

内查询用的是group by a.id,这里不好理解:

双表连接之后,会出现大量重复的元组,比如(分别表示a表的id,b表的id,Num):

(1,1,1)(1,2,1)(1,3,1)

(2,1,1)(2,2,1)(2,3,1)

(3,1,1)(3,2,1)(3,3,1)

所以,这里group by(a.id)是非常合理的。

2、

Employee 表包含所有员工,他们的经理也属于员工。每个员工都有一个 Id,此外还有一列对应员工的经理的 Id。

+----+-------+--------+-----------+
| Id | Name  | Salary | ManagerId |
+----+-------+--------+-----------+
| 1  | Joe   | 70000  | 3         |
| 2  | Henry | 80000  | 4         |
| 3  | Sam   | 60000  | NULL      |
| 4  | Max   | 90000  | NULL      |
+----+-------+--------+-----------+
给定 Employee 表,编写一个 SQL 查询,该查询可以获取收入超过他们经理的员工的姓名。在上面的表格中,Joe 是唯一一个收入超过他的经理的员工。

+----------+
| Employee |
+----------+
| Joe      |
+----------+


SELECT
	s.NAME 
FROM
	Employee as s 
WHERE
	Salary > ( SELECT Salary FROM Employee WHERE Id = s.ManagerId )

1、首先判断出员工的id和管理员ManagerId,

2、通过子查询判断出在员工的id和管理员ManagerId相等的情况下,员工的收入高于管理员的收入

总结:题目比较简短,注意理解题意

发布了33 篇原创文章 · 获赞 2 · 访问量 2924

猜你喜欢

转载自blog.csdn.net/qq_36690988/article/details/105069403