如何按国家分组取最高能力值球员,及处理姓名特殊字符?
问题与解决方案
原问题场景
原执行的SQL语句:
SELECT short_name, overall, club_name, nationality_name FROM FIFA.dbo.players_22
返回结果:
K. Mbappé 91 Paris Saint-Germain France M. Neuer 90 FC Bayern München Germany M. ter Stegen 90 FC Barcelona Germany H. Kane 90 Tottenham Hotspur England N. Kanté 90 Chelsea France K. Benzema 89 Real Madrid CF France
需求:仅返回每个国家overall(能力值)最高的球员,期望输出:
K. Mbappé 91 Paris Saint-Germain France M. Neuer 90 FC Bayern München Germany H. Kane 90 Tottenham Hotspur England
同时咨询:如何简便处理short_name列中的特殊字符(当前输出无法识别带重音的字母,比如é、ü这类乱码的重音字符)
一、实现各国最高能力值球员查询
直接按国家分组取MAX(overall)无法关联到对应球员的其他信息,推荐用窗口函数来实现:
方案:ROW_NUMBER()窗口函数
WITH ranked_players AS ( SELECT short_name, overall, club_name, nationality_name, -- 按国家分组,能力值降序排名 ROW_NUMBER() OVER (PARTITION BY nationality_name ORDER BY overall DESC) AS rank_num FROM FIFA.dbo.players_22 ) SELECT short_name, overall, club_name, nationality_name FROM ranked_players WHERE rank_num = 1;
说明:
- 这个方法会给每个国家的球员按能力值从高到低排名,取排名第1的球员
- 如果同一国家有多个球员能力值并列最高,只返回其中一个;若要保留所有并列球员,把
ROW_NUMBER()换成RANK()或DENSE_RANK()即可
二、处理short_name中的特殊重音字符
针对SQL Server环境,有以下几种简便方法:
1. 用排序规则快速去除重音
通过指定不区分重音的排序规则,自动将重音字符转换为无重音对应字符:
SELECT short_name, -- SQL_Latin1_General_CP1_CI_AI 中AI表示不区分重音 short_name COLLATE SQL_Latin1_General_CP1_CI_AI AS cleaned_name FROM FIFA.dbo.players_22;
效果:é会转为e,ü转为u,直接消除重音乱码问题。
2. 手动替换特定重音字符
如果只需要处理少数几种重音字符,直接用REPLACE批量替换:
SELECT short_name, REPLACE(REPLACE(short_name, 'é', 'é'), 'ü', 'ü') AS cleaned_name FROM FIFA.dbo.players_22;
优点是精准,缺点是需要逐个列举要替换的字符。
3. 自定义函数批量处理
如果需要处理大量重音字符,创建一个自定义函数封装替换逻辑,方便重复调用:
CREATE FUNCTION dbo.CleanAccentedChars(@input NVARCHAR(MAX)) RETURNS NVARCHAR(MAX) AS BEGIN DECLARE @result NVARCHAR(MAX) = @input; -- 替换常见重音乱码字符 SET @result = REPLACE(@result, 'á', 'á'); SET @result = REPLACE(@result, 'é', 'é'); SET @result = REPLACE(@result, 'Ã', 'í'); SET @result = REPLACE(@result, 'ó', 'ó'); SET @result = REPLACE(@result, 'ú', 'ú'); SET @result = REPLACE(@result, 'ü', 'ü'); SET @result = REPLACE(@result, 'ñ', 'ñ'); -- 可根据需求继续添加其他替换规则 RETURN @result; END;
调用方式:
SELECT short_name, dbo.CleanAccentedChars(short_name) AS cleaned_name FROM FIFA.dbo.players_22;
内容的提问来源于stack exchange,提问作者JoeMama786
相关产品推荐
相关产品推荐

