首页 > 数据库 >力扣-Mysql-3252-英超积分榜排名 II(中等)

力扣-Mysql-3252-英超积分榜排名 II(中等)

时间:2024-11-14 15:44:28浏览次数:3  
标签:拿下 3252 II 球队 积分榜 team Tier 排名 等级

一、题目来源

3252. 英超积分榜排名 II - 力扣(LeetCode)

二、数据表结构

表:TeamStats

+------------------+---------+
| Column Name      | Type    |
+------------------+---------+
| team_id          | int     |
| team_name        | varchar |
| matches_played   | int     |
| wins             | int     |
| draws            | int     |
| losses           | int     |
+------------------+---------+
team_id 是这张表的唯一主键。
这张表包含队伍 id,队伍名,场次,赢局,平局和输局。



三、需求

编写一个解决方案来计算联盟中每支球队的 得分排名 和 等级。积分计算方式如下:

  • 赢局 有 3 点得分
  • 平局 有 1 点得分
  • 输局 有 0 点得分

注意:积分相同的球队必须分配相同的排名。

等级评级:

  • 根据积分将联盟分为 3 个等级:
  • 等级 1:前 33% 的队伍
  • 等级 2:中间 33% 的队伍
  • 等级 3:最后 34% 的队伍
  • 如果等级边界出现平局,平局的队伍分配到更高的等级。

返回结果表以 points 降序 排序,然后以 team_name 升序 排序。

四、示例数据

输入:

TeamStats 表:

+---------+-------------------+----------------+------+-------+--------+
| team_id | team_name         | matches_played | wins | draws | losses |
+---------+-------------------+----------------+------+-------+--------+
| 1       | Chelsea           | 22             | 13   | 2     | 7      |
| 2       | Nottingham Forest | 27             | 6    | 6     | 15     |
| 3       | Liverpool         | 17             | 1    | 8     | 8      |
| 4       | Aston Villa       | 20             | 1    | 6     | 13     |
| 5       | Fulham            | 31             | 18   | 1     | 12     |
| 6       | Burnley           | 26             | 6    | 9     | 11     |
| 7       | Newcastle United  | 33             | 11   | 10    | 12     |
| 8       | Sheffield United  | 20             | 18   | 2     | 0      |
| 9       | Luton Town        | 5              | 4    | 0     | 1      |
| 10      | Everton           | 14             | 2    | 6     | 6      |
+---------+-------------------+----------------+------+-------+--------+

输出:

+-------------------+--------+----------+---------+
| team_name         | points | position | tier    |
+-------------------+--------+----------+---------+
| Sheffield United  | 56     | 1        | Tier 1  |
| Fulham            | 55     | 2        | Tier 1  |
| Newcastle United  | 43     | 3        | Tier 1  |
| Chelsea           | 41     | 4        | Tier 1  |
| Burnley           | 27     | 5        | Tier 2  |
| Nottingham Forest | 24     | 6        | Tier 2  |
| Everton           | 12     | 7        | Tier 2  |
| Luton Town        | 12     | 7        | Tier 2  |
| Liverpool         | 11     | 9        | Tier 3  |
| Aston Villa       | 9      | 10       | Tier 3  |
+-------------------+--------+----------+---------+

解释:

  • 谢菲尔德联队拿下 56 分(18 胜 * 3 分 + 2 平 * 1 分)位列第 1。
  • 富勒姆拿下 55 分(18 胜 * 3 分 + 1 平 * 1 分)位列第 2。
  • 纽卡斯尔联队拿下 43 分(11 胜 * 3 分 + 10 平 * 1 分)位列第 3。
  • 切尔西拿下 41 分(13 胜 * 3 分 + 2 平 * 1 分)位列第 4。
  • 伯恩利拿下 27 分(6 胜 * 3 分 + 9 平 * 1 分)位列第 5。
  • 诺丁汉森林拿下 24 分(6 胜 * 3 分 + 6 平 * 1 分)位列第 6。
  • 埃弗顿和卢顿镇均拿下 12 分,埃弗顿 2 胜 * 3 分 + 6 平 * 1 分,卢顿镇 4 胜 * 3 分。两支队伍并列位列第 7。
  • 利物浦拿下 11 分(1 胜 * 3 分 + 8 平 * 1 分)位列第 9。
  • 阿斯顿维拉拿下 9 分(1 胜 * 3 分 + 6 平 * 1 分)位列第 10。

等级计算:

  • 等级 1:根据积分排名前 33% 的球队。谢菲尔德联队、富勒姆、纽卡斯尔联队和切尔西属于等级 1。
  • 等级 2:中间 33% 的球队。伯恩利、诺丁汉森林、埃弗顿和卢顿镇属于等级 2。
  • 等级 3:垫底 34% 的球队。利物浦和阿斯顿维拉落入等级 3。



五、分析


1.文字分析
 

第一步:计算每支球队的得分:wins*3+draws,再跟据球队得分的降序进行排名,积分相同的球队必须分配相同的排名,所以使用rank()函数进行排名;

第二步:获取参加比赛的球队总数;

第三步:使用case when进行条件判断,对每支球队进行等级划分。

2.图解


六、代码实现

with t1 AS (
    SELECT
        team_name,
        wins *  3 + draws as points,
        rank() OVER (ORDER BY  wins* 3 + draws desc) position
    from TeamStats

 ),t2 AS (
    SELECT
        count(team_id) as total
    from TeamStats
)
select
    t1.*,
    (CASE
        when position <= ceiling(total * 0.33) THEN 'Tier 1'
        when position > ceiling(total * 0.33) and position <= ceiling(total * 0.66) then 'Tier 2'
        ELSE 'Tier 3'
        end) as tier
from t1,t2
ORDER BY points desc , team_name;



七、总结
 

本题需求为获取英超球队积分榜排名;

本题没有太难思考的点,唯一要注意的是在进行等级划分时,不可能将球队分割,所以要选择是向上取整还是向下取整,本题选择的是向上取整函数--ceiling()函数;

Ceiling() 函数是一个数学函数,用于向上取整。它返回大于或等于给定数字的最小整数。

语法为:ceiling(x),其中 是要进行向上取整操作的数值表达式,可以是一个数字、一个包含数字的列或者是一个能返回数字的表达式。

因为积分相同的球队必须分配相同的排名,所以要选择使用 rank() 排名函数,结果是 存在并列排名但排名不连续的。

标签:拿下,3252,II,球队,积分榜,team,Tier,排名,等级
From: https://blog.csdn.net/Jotcy/article/details/143773196

相关文章

  • LeetCode 1103[分糖果II]
    题目链接LeetCode1103[分糖果II]详情实例提示题解思路定义容器vecRet,使每个元素值均为0,即代表每个孩子手上开始都是0个糖果定义iCount为默认的糖果数量,初始值为1逐个遍历容器,也就是开始给每个孩子分糖果获取容器当前元素值,即每个孩子当前的糖果数量iAt如果糖果......
  • 查看IIS版本号
    要查看IIS版本,有几种常用的方法:通过IIS管理器查看版本:打开IIS管理器,可以通过在Windows操作系统的开始菜单中搜索"IIS管理器"来找到。在IIS管理器中,选择“帮助”->“关于Internet信息服务”,在弹出的对话框中可以看到IIS的版本号。通过命令行查看版本(没试出来):打开命令提......
  • 一文讲透Windows平台下的ASCII,Unicode编码问题
    ascii控制字符的编号范围是0-31和127(0x00-0x1F和0x7F),共33个字符。可显示字符编号范围是32-126(0x20-0x7E),共95个字符。((20241112221251-kkgxrg6"标准ASCII码对照表"))UNICODE美国人意识到他们应该提出一种标准方案来展示世界上所有语言中的所有字符,出于这个目的,Unicode诞......
  • 洛谷P1182 数列分段 Section II
    洛谷P1182数列分段SectionIIP1182数列分段SectionII数列分段SectionII题目描述对于给定的一个长度为的正整数数列,现要将其分成()段,并要求每段连续,且每段和的最大值最小。关于最大值最小:例如一数列要分成段。将其如下分段:第一段和为,第段和为,第段和为,和......
  • About SAMSUNG Galaxy Tab S9 and Sony Xperia 5 II
    SAMSUNGGalaxyTabS9默认音量为40%(7格),默认未开启杜比音效国行和港版可以互刷,没有任何问题国行刷为港版后送一年GoodNotes订阅、半年CLIPSTUDIOPAINT订阅固件下载地址:SM-X710/GalaxyTabS9(Wi-Fi)FirmwareDownloadSM-X710FreeDownload刷机工具下载地址:OdinFlashT......
  • 力扣刷题——3261. 统计满足 K 约束的子字符串数量 II
    看了题目的两个初始用例,感觉能用前缀和和滑动窗口来解决,前缀和设定为从下标0到当前位置所有符合条件的答案数量,于是先写了一个:vector<longlong>countKConstraintSubstrings(strings,intk,vector<vector<int>>&queries){intn=s.size();vector<longlong>pre......
  • Vue网站发布到iis后提示404页面不可访问
    vue重定向和跨域配置:https://zhuanlan.zhihu.com/p/5306882511.安装组件:URLRewrite:https://www.iis.net/downloads/microsoft/url-rewriteApplicationRequestRouting:https://www.iis.net/downloads/microsoft/application-request-routing2.新建一个web.config放到发布到文件......
  • 代码随想录算法训练营第二十五天| leetcode491.递增子序列、leetcode46.全排列、leetc
    1leetcode491.递增子序列题目链接:491.非递减子序列-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法精讲,树层去重与树枝去重|LeetCode:491.递增子序列_哔哩哔哩_bilibili思路:用之前的方法,结果翻车了,好好看视频学新技能吧1.1视频后的思路真的没想到用set来去重,还是基......
  • 代码随想录算法训练营第二十四天| leetcode93.复原IP地址、 leetcode78.子集、leetcod
    1leetcode93.复原IP地址题目链接:93.复原IP地址-力扣(LeetCode)文章链接:代码随想录视频链接:回溯算法如何分割字符串并判断是合法IP?|LeetCode:93.复原IP地址_哔哩哔哩_bilibili思路:就是将这个字符串符合要求的进行一个收集,然后使用列表存储,最后使用join函数将这个列表进行连......
  • 力扣21 打卡15 长度为 K 的子数组的能量值 II
    思路:该算法使用滑动窗口和计数器来判断每个长度为(k)的子数组是否满足连续递增的条件。遍历数组时,使用cnt记录当前连续递增的元素数。如果当前元素和前一个元素不连续递增,则将cnt重置为1,否则增加cnt。当cnt大于等于(k)时,表示找到了一个满足条件的子数组,将......