学点实用SQL技巧题 ——《寻找面试候选人》LeetCode Plus 会员专享题详细解析Hive / MySQL

Posted 报告,今天也有好好学习

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了学点实用SQL技巧题 ——《寻找面试候选人》LeetCode Plus 会员专享题详细解析Hive / MySQL相关的知识,希望对你有一定的参考价值。

大家好,我是老吴,大家也可以叫我吴同学,再小一点的朋友也可以叫我吴师兄。欢迎大家跟我一起走进数据分析的世界,一起学习!

感兴趣的朋友可以关注我的数据分析专栏,里面有许多优质的文章跟大家分享哦。
另外也欢迎大家关注我的SQL刷题专栏,里面有我分享的高质量SQL题,以及详细的解析。


本篇博文又是我的SQL题分享环节,为了记录一下自己的做题过程,以及防止后续力扣会员过期无法再次查看题目,所以我每天都会给大家选出一道质量较高的SQL题目发表到博客上,并且会加上自己的一些解题技巧或实用知识点,希望对大家也能有所帮助。

那么今天给大家分享的题是LeetCode的第811题——寻找面试候选人

下面是问题的详细描述。

问题描述

表: Contests

+--------------+------+
| Column Name  | Type |
+--------------+------+
| contest_id   | int  |
| gold_medal   | int  |
| silver_medal | int  |
| bronze_medal | int  |
+--------------+------+
contest_id 是该表的主键.
该表包含LeetCode竞赛的ID和该场比赛中金牌、银牌、铜牌的用户id。
可以保证,所有连续的比赛都有连续的ID,没有ID被跳过。

Table: Users

+-------------+---------+
| Column Name | Type    |
+-------------+---------+
| user_id     | int     |
| mail        | varchar |
| name        | varchar |
+-------------+---------+
user_id 是该表的主键.
该表包含用户信息。

编写 SQL 语句来返回面试候选人的 姓名和 邮件.当用户满足以下两个要求中的任意一条,其成为面试候选人:

  • 该用户在连续三场及更多比赛中赢得奖牌。
  • 该用户在三场及更多不同的比赛中赢得金牌(这些比赛可以不是连续的)
    可以以任何顺序返回结果。

查询结果格式如下例所示:

Contests表:
+------------+------------+--------------+--------------+
| contest_id | gold_medal | silver_medal | bronze_medal |
+------------+------------+--------------+--------------+
| 190        | 1          | 5            | 2            |
| 191        | 2          | 3            | 5            |
| 192        | 5          | 2            | 3            |
| 193        | 1          | 3            | 5            |
| 194        | 4          | 5            | 2            |
| 195        | 4          | 2            | 1            |
| 196        | 1          | 5            | 2            |
+------------+------------+--------------+--------------+

Users表:
+---------+--------------------+-------+
| user_id | mail               | name  |
+---------+--------------------+-------+
| 1       | sarah@leetcode.com | Sarah |
| 2       | bob@leetcode.com   | Bob   |
| 3       | alice@leetcode.com | Alice |
| 4       | hercy@leetcode.com | Hercy |
| 5       | quarz@leetcode.com | Quarz |
+---------+--------------------+-------+

结果表:
+-------+--------------------+
| name  | mail               |
+-------+--------------------+
| Sarah | sarah@leetcode.com |
| Bob   | bob@leetcode.com   |
| Alice | alice@leetcode.com |
| Quarz | quarz@leetcode.com |
+-------+--------------------+

Sarah 赢得了3块金牌 (190, 193, and 196),所以我们将她列入结果表。
Bob在连续3场竞赛中赢得了奖牌(190, 191, and 192), 所以我们将他列入结果表。
    - 注意他在另外的连续3场竞赛中也赢得了奖牌(194, 195, and 196).
Alice在连续3场竞赛中赢得了奖牌 (191, 192, and 193), 所以我们将她列入结果表。
Quarz在连续5场竞赛中赢得了奖牌(190, 191, 192, 193, and 194), 所以我们将他列入结果表。

解题思路

  1. 第二个条件很容易实现:用roup by gold_medal即可筛选出次数大于等于3的,然后left join一下users表即可得到name和mail。
  2. 关键是第一个条件,怎么才能连续三场都拿奖牌的人呢?
  3. 这里分享一个这种类型题的小技巧:用row_number函数,标好每行的序号,然后contest_id减去序号,差相等即代表连续。
  4. 记住这个小技巧,后面要用到。
  5. 首先理清我们的目标:查看每一个用户的考试情况,然后看看他有没有连续三次拿奖的情况。
  6. 怎么查看呢?这里就需要用到表连接,连接的条件是user_id出现在了金银铜中即可。
  7. 连接完之后呢,用窗口函数,对每个用户分区,并按contest_id排序,排好序之后,用contest_id-序号,得到差值。
  8. 最后根据用户id和这个差值分组,筛选出组大小不小于3的即可。
  9. 最终union第二个条件得到的数据即可。

代码实现

select name, mail
from (
    select name, mail,
        contest_id - row_number() over(partition by user_id order by contest_id) rn,
        user_id 
    from Contests
    join Users
    on user_id in (gold_medal, silver_medal, bronze_medal) 
) as tmp
group by user_id, rn
having count(1) >= 3
union
select name, mail
from Contests
join Users
on gold_medal = user_id
group by gold_medal
having count(1) >= 3

结束语

看完这篇,还有更多知识点分享给你哦,自己慢慢找哈,就在下面链接。


推荐关注的专栏

👨‍👩‍👦‍👦 机器学习:分享机器学习实战项目和常用模型讲解
👨‍👩‍👦‍👦 数据分析:分享数据分析实战项目和常用技能整理

往期内容回顾

💚 学习Python全套代码【超详细】Python入门、核心语法、数据结构、Python进阶【致那个想学好Python的你】
❤️ 学习pandas全套代码【超详细】数据查看、输入输出、选取、集成、清洗、转换、重塑、数学和统计方法、排序
💙 学习pandas全套代码【超详细】分箱操作、分组聚合、时间序列、数据可视化
💜 学习NumPy全套代码【超详细】基本操作、数据类型、数组运算、复制和试图、索引、切片和迭代、形状操作、通用函数、线性代数


关注我,了解更多相关知识!

CSDN@报告,今天也有好好学习

以上是关于学点实用SQL技巧题 ——《寻找面试候选人》LeetCode Plus 会员专享题详细解析Hive / MySQL的主要内容,如果未能解决你的问题,请参考以下文章

SQL优化|Java面试题

Java面试题

面试官:给你一段有问题的SQL,如何优化?

面试官:给你一段有问题的SQL,如何优化?

一文学会链表快慢指针解题技巧

LeetCode(数据库)- 寻找面试候选人