SQL JOIN仅返回首条匹配:查询FIFA球员最高评分及对应最小年龄
方案1:使用窗口函数(适配MySQL 8.0+/PostgreSQL/SQL Server等支持窗口函数的数据库)
SELECT id, name, position, rating, age FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY id ORDER BY rating DESC, age ASC ) AS rn FROM fifa_player_ratings ) t WHERE rn = 1;
逻辑说明:
PARTITION BY id按球员ID分组,每位球员单独排序ORDER BY rating DESC组内先按评分降序排列,最高评分排在最前- 追加
age ASC保证同评分的行按年龄升序排列,首次达到最高评分的最小年龄行排在最前 - 最后筛选每组行号为1的记录,即可得到每位球员符合要求的唯一数据
方案2:兼容不支持窗口函数的低版本数据库
SELECT t1.* FROM fifa_player_ratings t1 INNER JOIN ( -- 先获取每位球员的最高评分、以及该评分对应的最小年龄 SELECT id, MAX(rating) AS max_rating, MIN(age) AS min_age FROM fifa_player_ratings GROUP BY id ) t2 ON t1.id = t2.id AND t1.rating = t2.max_rating AND t1.age = t2.min_age;
以上两种方案运行你提供的示例数据,都可以得到你期望的输出结果,不会出现重复条目。
内容的提问来源于stack exchange,提问作者Xavier
相关产品推荐
相关产品推荐

