题目描述
(通过次数4,820 | 提交次数5,910,通过率81.56%)
表:Players +----------------+---------+ | Column Name | Type | +----------------+---------+ | player_id | int | | player_name | varchar | +----------------+---------+ player_id 是这个表的主键 这个表的每一行给出一个网球运动员的 ID 和 姓名 表:Championships +---------------+---------+ | Column Name | Type | +---------------+---------+ | year | int | | Wimbledon | int | | Fr_open | int | | US_open | int | | Au_open | int | +---------------+---------+ year 是这个表的主键 该表的每一行都包含在每场大满贯网球比赛中赢得比赛的球员的 ID 请写出查询语句,查询出每一个球员赢得大满贯比赛的次数。结果不包含没有赢得比赛的球员的ID 。 结果集 无顺序要求 。 查询结果的格式,如下所示。 示例 1: 输入: Players 表: +-----------+-------------+ | player_id | player_name | +-----------+-------------+ | 1 | Nadal | | 2 | Federer | | 3 | Novak | +-----------+-------------+ Championships 表: +------+-----------+---------+---------+---------+ | year | Wimbledon | Fr_open | US_open | Au_open | +------+-----------+---------+---------+---------+ | 2018 | 1 | 1 | 1 | 1 | | 2019 | 1 | 1 | 2 | 2 | | 2020 | 2 | 1 | 2 | 2 | +------+-----------+---------+---------+---------+ 输出: +-----------+-------------+-------------------+ | player_id | player_name | grand_slams_count | +-----------+-------------+-------------------+ | 2 | Federer | 5 | | 1 | Nadal | 7 | +-----------+-------------+-------------------+ 解释: Player 1 (Nadal) 获得了 7 次大满贯:其中温网 2 次(2018, 2019), 法国公开赛 3 次 (2018, 2019, 2020), 美国公开赛 1 次 (2018)以及澳网公开赛 1 次 (2018) 。 Player 2 (Federer) 获得了 5 次大满贯:其中温网 1 次 (2020), 美国公开赛 2 次 (2019, 2020) 以及澳网公开赛 2 次 (2019, 2020) 。 Player 3 (Novak) 没有赢得,因此不包含在结果集中。 来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/grand-slam-titles
//测试数据 Create table If Not Exists Players (player_id int, player_name varchar(20)); Create table If Not Exists Championships (year int, Wimbledon int, Fr_open int, US_open int, Au_open int); insert into Players (player_id, player_name) values ('1', 'Nadal'); insert into Players (player_id, player_name) values ('2', 'Federer'); insert into Players (player_id, player_name) values ('3', 'Novak'); insert into Championships (year, Wimbledon, Fr_open, US_open, Au_open) values ('2018', '1', '1', '1', '1'); insert into Championships (year, Wimbledon, Fr_open, US_open, Au_open) values ('2019', '1', '1', '2', '2'); insert into Championships (year, Wimbledon, Fr_open, US_open, Au_open) values ('2020', '2', '1', '2', '2');
解题思路
Players表保存了所有的网球运动员信息。
Championships表保存了每个年份,在4个比赛中获得大满贯的运动员。而Championships表是按年保存的数据,4个比赛的获得者存储在不同的字段中,在计算总数时,可以使用如下两种方法进行计算。
第一种:将Championships表的数据使用列转行的方法,一行转成4行,再按运动员ID汇总统计。
第二种:Players表与Championships表使用笛卡尔积关联,两两组合,然后在汇总时,判断获取大满贯的运动员ID与当前运动员ID是否相同。如果相同,则计数1次。最后再使用GROUP BY+SUM汇总。
参考SQL
未特别说明的情况下,参考SQL为基于MySQL8.0实现。
select a.player_id, max(a.player_name) player_name, sum( case when a.player_id = b.Wimbledon then 1 else 0 end + case when a.player_id = b.Fr_open then 1 else 0 end + case when a.player_id = b.US_open then 1 else 0 end + case when a.player_id = b.Au_open then 1 else 0 end ) grand_slams_count from Players a inner join Championships b on 1=1 group by a.player_id having grand_slams_count > 0;
本站所有内容均为原创,本站保留所有权利。仅允许非商业用途的转载,但必须注明来源网站、作者、来源链接!否则,由此造成的一切后果,由转载方承担!
干货分享、技术提升、面试笔试、学习交流,欢迎关注公众号:xuesql。QQ学习交流群:209942678。