我试图在我的表格中的 2 个联赛中展示最好的击球手(最高击球率)。不幸的是,我只得到最高的平均水平。更具体地说,我希望结果显示第一个联赛的名称、该联赛中击球率最高的运动员及其击球率。然后我想让第二个联赛与那个联赛中击球率最高的运动员一起,然后是他们的击球率。
这是我的代码:
SELECT teamLeague, athleteFirstName, athleteLastName, athleteBattingAvg AS 'Athlete Batting Average'
FROM team FULL JOIN athlete ON athlete.teamId = team.teamId
WHERE athleteBattingAvg =
(SELECT MAX(athleteBattingAvg)
FROM athlete)
GROUP BY teamLeague, athleteFirstName, athleteLastName, athleteBattingAvg;
我知道我必须遗漏一些东西才能获得总体平均水平,而只是在各自的联赛中获得最高分,但我不知道是什么。
假设 MySQL 8 或更高版本:
SELECT
teamLeague
, athleteFirstName
, athleteLastName
, athleteBattingAvg AS 'Athlete Batting Average'
FROM (
SELECT
teamLeague
, athleteFirstName
, athleteLastName
, athleteBattingAvg
, row_number() OVER(partition by teamLeague ORDER BY athleteBattingAvg DESC) AS RN
FROM team
FULL JOIN athlete ON athlete.teamId = team.teamId
) AS D
WHERE RN = 1
不能保证一个联赛的平均击球率等于所有联赛的最高击球率,因此您当前的 where 子句是有问题的,最好避免。而是使用
ROW_NUMBER()
将值 1 分配给每个联赛中的最高安打率(注意使用的“分区”实现了这一点)。
另一个注意事项是,如果有相同最高安打率的球员,那么您可以使用
DENSE_RANK()
而不是 row_number,这将允许返回多个排名为 1 的球员。