四题都比较简单,可以直接秒。
1. 力扣2082:富有客户的数量
1.1 题目:
表: Store
+-------------+------+
| Column Name | Type |
+-------------+------+
| bill_id | int |
| customer_id | int |
| amount | int |
+-------------+------+
bill_id 是这个表的主键(具有唯一值的列)。
每一行包含一个订单的金额及相关客户的信息。
编写解决方案找出 至少有一个 订单的金额 严格大于 500
的客户的数量。
返回结果格式如下示例所示:
示例 1:
输入:
Store 表:
+---------+-------------+--------+
| bill_id | customer_id | amount |
+---------+-------------+--------+
| 6 | 1 | 549 |
| 8 | 1 | 834 |
| 4 | 2 | 394 |
| 11 | 3 | 657 |
| 13 | 3 | 257 |
+---------+-------------+--------+
输出:
+------------+
| rich_count |
+------------+
| 2 |
+------------+
解释:
客户 1 有 2 个订单金额严格大于 500。
客户 2 没有任何订单金额严格大于 500。
客户 3 有 1 个订单金额严格大于 500。
1.2 思路:
75+通过率的简单题。
1.3 题解:
sql
-- 以客户id分组,只要他的最高的一次订单金额是严格大于500的就保留下来即可
with tep as (
select customer_id
from Store
group by customer_id
having max(amount) > 500
)
select count(*) rich_count
from tep
2. 力扣2084:为订单类型为0的客户删除类型为1的订单
2.1 题目:
活动表: Orders
+-------------+------+
| Column Name | Type |
+-------------+------+
| order_id | int |
| customer_id | int |
| order_type | int |
+-------------+------+
order_id是此表的主键列。
此表的每一行都表示订单的ID、订购该订单的客户的ID以及订单类型。
订单可以是类型0或类型1。
编写SQL查询以根据以下条件报告所有订单:
- 如果客户至少有一个类型为0的订单,则不要报告该客户的任何类型为1的订单。
- 否则,报告客户的所有订单。
按任意顺序返回结果表。
查询结果格式如下例所示。
示例 1:
输入:
Orders table:
+----------+-------------+------------+
| order_id | customer_id | order_type |
+----------+-------------+------------+
| 1 | 1 | 0 |
| 2 | 1 | 0 |
| 11 | 2 | 0 |
| 12 | 2 | 1 |
| 21 | 3 | 1 |
| 22 | 3 | 0 |
| 31 | 4 | 1 |
| 32 | 4 | 1 |
+----------+-------------+------------+
输出:
+----------+-------------+------------+
| order_id | customer_id | order_type |
+----------+-------------+------------+
| 31 | 4 | 1 |
| 32 | 4 | 1 |
| 1 | 1 | 0 |
| 2 | 1 | 0 |
| 11 | 2 | 0 |
| 22 | 3 | 0 |
+----------+-------------+------------+
解释:
客户1有两个类型为0的订单。我们两个都返回。
客户2的订单类型为0,订单类型为1。我们只返回类型为0的订单。
客户3的订单类型为0,订单类型为1。我们只返回类型为0的订单。
客户4有两个类型1的订单。我们两个都返回。
2.2 思路:
分为两种情况。
然后将两种情况查询到的结果union起来。
2.3 题解:
sql
-- 先找到客户的订单类型有0的那些客户
with tep as (
select customer_id
from Orders
group by customer_id
having min(order_type) = 0
)
-- 然后找到不在tep表里的客户的其他客户
-- 查询这些客户的所有信息
select *
from Orders
where customer_id not in (select * from tep)
union all
-- 找到这些客户,并删除该客户类型是1的订单
select order_id, o.customer_id, order_type
from Orders o
join tep
on o.customer_id = tep.customer_id
where order_type = 0
3. 力扣2072:赢得比赛的大学
3.1 题目:
表: NewYork
+-------------+------+
| Column Name | Type |
+-------------+------+
| student_id | int |
| score | int |
+-------------+------+
在 SQL 中,student_id 是这个表的主键。
每一行包含纽约大学 (New York University) 中一名学生一次考试的成绩。
表: California
+-------------+------+
| Column Name | Type |
+-------------+------+
| student_id | int |
| score | int |
+-------------+------+
在 SQL 中,student_id 是这个表的主键。
每一行包含加州大学 (California University) 中一名学生一次考试的成绩。
纽约大学和加州大学之间举行了一场比赛。这场比赛由两所大学中相同数量的学生参加。拥有更多优秀学生 的大学赢得这场比赛。如果两所大学的优秀学生数量相同,则这场比赛平局。
优秀学生 是指在考试中获得 90%
或更高成绩的学生。
返回:
- "New York University" 若纽约大学赢得这场比赛。
- "California University" 若加州大学赢得这场比赛。
- "No Winner" 若这场比赛平局。
返回结果格式如下示例所示:
示例 1:
输入:
NewYork 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 1 | 90 |
| 2 | 87 |
+------------+-------+
California 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 2 | 89 |
| 3 | 88 |
+------------+-------+
输出:
+---------------------+
| winner |
+---------------------+
| New York University |
+---------------------+
解释:
纽约大学有 1 名优秀学生,加州大学有 0 名优秀学生。
示例 2:
输入:
NewYork 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 1 | 89 |
| 2 | 88 |
+------------+-------+
California 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 2 | 90 |
| 3 | 87 |
+------------+-------+
输出:
+-----------------------+
| winner |
+-----------------------+
| California University |
+-----------------------+
解释:
纽约大学有 0 名优秀学生,加州大学有 1 名优秀学生。
示例 3:
输入:
NewYork 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 1 | 89 |
| 2 | 90 |
+------------+-------+
California 表:
+------------+-------+
| student_id | score |
+------------+-------+
| 2 | 87 |
| 3 | 99 |
+------------+-------+
输出:
+-----------+
| winner |
+-----------+
| No Winner |
+-----------+
解释:
纽约大学和加州大学均有 1 名优秀学生。
3.2 思路:
3.3 题解:
sql
SELECT
CASE
WHEN (SELECT COUNT(*) FROM NewYork WHERE score >= 90) > (SELECT COUNT(*) FROM California WHERE score >= 90) THEN 'New York University'
WHEN (SELECT COUNT(*) FROM NewYork WHERE score >= 90) < (SELECT COUNT(*) FROM California WHERE score >= 90) THEN 'California University'
ELSE 'No Winner'
END AS winner;
4. 力扣2112:最繁忙的机场
4.1 题目:
表: Flights
+-------------------+------+
| Column Name | Type |
+-------------------+------+
| departure_airport | int |
| arrival_airport | int |
| flights_count | int |
+-------------------+------+
(departure_airport, arrival_airport) 是该表的主键列。
该表的每一行都表示从 departure_airport 出发并到达 arrival_airport 的 flights_count 航班。
编写一个 SQL 来查询 流量最大的机场的 ID。客流量最大的机场是指从该机场起飞或抵达该机场的航班总数最多的机场。如果有多个机场流量最大,请全部查询出来。
以 任意顺序返回结果表。
查询结果格式如下所示。
示例 1:
输入:
Flights 表:
+-------------------+-----------------+---------------+
| departure_airport | arrival_airport | flights_count |
+-------------------+-----------------+---------------+
| 1 | 2 | 4 |
| 2 | 1 | 5 |
| 2 | 4 | 5 |
+-------------------+-----------------+---------------+
输出:
+------------+
| airport_id |
+------------+
| 2 |
+------------+
解释:
1 号机场有 9 个航班 (4 个出发, 5 个到达).
2 号机场有 14 个航班 (10 个出发, 4 个到达).
4 号机场有 5 个航班 (5 个到达).
客流量最大的机场是 2 号机场。
示例 2:
输入:
Flights 表:
+-------------------+-----------------+---------------+
| departure_airport | arrival_airport | flights_count |
+-------------------+-----------------+---------------+
| 1 | 2 | 4 |
| 2 | 1 | 5 |
| 3 | 4 | 5 |
| 4 | 3 | 4 |
| 5 | 6 | 7 |
+-------------------+-----------------+---------------+
输出:
+------------+
| airport_id |
+------------+
| 1 |
| 2 |
| 3 |
| 4 |
+------------+
解释:
1 号机场有 9 个航班 (4 个出发, 5 个到达).
2 号机场有 9 个航班 (5 个出发, 4 个到达).
3 号机场有 9 个航班 (5 个出发, 4 个到达).
4 号机场有 9 个航班 (5 个出发, 4 个到达).
5 号机场有 7 个航班 (7 个出发).
6 号机场有 7 个航班 (7 个到达).
流量最大的机场是机场 1、2、3 和 4。
4.2 思路:
先炸裂,然后就是简单的分组。
4.3 题解:
sql
-- 炸裂,然后得到需要的表
with tep as (
select departure_airport airport, flights_count from Flights
union all
select arrival_airport airport, flights_count from Flights
)
-- 然后再查询每个机场的人流量是否是最大的。
select airport airport_id
from tep
group by airport
having sum(flights_count) >= all(
-- 这里是查询到每个机场的人流量
select sum(flights_count)
from tep
group by airport
)
5. 力扣180:连续出现的数字
5.1 题目:
表:Logs
+-------------+---------+
| Column Name | Type |
+-------------+---------+
| id | int |
| num | varchar |
+-------------+---------+
在 SQL 中,id 是该表的主键。
id 是一个自增列。
找出所有至少连续出现三次的数字。
返回的结果表中的数据可以按 任意顺序 排列。
结果格式如下面的例子所示:
示例 1:
输入:
Logs 表:
+----+-----+
| id | num |
+----+-----+
| 1 | 1 |
| 2 | 1 |
| 3 | 1 |
| 4 | 2 |
| 5 | 1 |
| 6 | 2 |
| 7 | 2 |
+----+-----+
输出:
Result 表:
+-----------------+
| ConsecutiveNums |
+-----------------+
| 1 |
+-----------------+
解释:1 是唯一连续出现至少三次的数字。
5.2 思路:
感觉之前写过类似的,遇见就很简单。
三张表join然后where过滤,最后注意distinct去重。
5.3 题解:
sql
-- join三张表自连接
select distinct l1.num ConsecutiveNums
from Logs l1, Logs l2, Logs l3
where
l1.id + 1 = l2.id and l1.num = l2.num
and
l2.id + 1 = l3.id and l2.num = l3.num