力扣(LeetCode)刷题

本文介绍两道SQL查询挑战,一是找出连续出现三次以上的数字,二是筛选出薪资超过其经理的员工。通过实际案例,展示如何使用SQL进行复杂的数据筛选与对比。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

力扣(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相等的情况下,员工的收入高于管理员的收入

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值