SQL数据库中有一个名为Players的表: 玩家(身份证,姓名,年龄,性别,得分) 其中ID是主键。
现在我想写一个查询来查找以下结果: 对于每个年龄段,找到这个年龄段所有玩家中得分最高的玩家的姓名和年龄。
我写了以下查询:
SELECT P.name, P.age
FROM Players P
WHERE P.score = (SELECT MAX(P2.score) FROM Players P2)
GROUP BY P.age, P.name
ORDER BY S.age
然而,上述查询的结果是所有年龄段的所有玩家中得分最高的玩家列表,而不是每个年龄段。
然后我将查询更改为以下内容:
SELECT P.name, P.age, MAX(P.score)
FROM Players P
GROUP BY P.age, P.name
ORDER BY P.age
然而,我写的第二个查询给出了每个年龄段的球员列表,但是对于每个年龄段,不仅有得分最高的球员,而且在该年龄组中得分较低的其他球员。
我应该如何修复逻辑/查询代码?
谢谢!
答案 0 :(得分:1)
您可以使用rank
执行此操作。
select name, age
from (
SELECT *,
rank() over(partition by age order by score desc) rnk
FROM Players) t
where rnk = 1
答案 1 :(得分:0)
您的原始查询非常接近。您只需将子查询更改为相关子查询并删除GROUP BY
子句:
SELECT P.name, P.age
FROM Players P
WHERE P.score = (SELECT MAX(P2.score) FROM Players P2 WHERE p2.age = p.age)
ORDER BY P.age;
分析排名函数是处理此问题的另一种非常可行的方法。两种方法都可以利用Players(age, score)
上的索引。这也需要Players(score)
上的索引。使用该索引,这应该可以在大型数据集上获得更好的性能。
答案 2 :(得分:0)
您也可以尝试一下。
SELECT p.name, p.age, p.score
FROM players p
INNER JOIN
(SELECT `age`, MAX(`score`) AS Maxscore
FROM players
GROUP BY `age`) pp
ON p.`age` = pp.`age`
AND p.`score` = pp.Maxscore;
答案 3 :(得分:0)
尝试这样可以解决您的问题:
select p1.name,p1.age,p1.score from players p1 where p1.score =
(SELECT max(score) from players where age = p1.age) group by p1.age;
如果您要求所有具有相同最高分的记录: 然后你会用这个。我已在本地主机上测试了这两个查询。
SELECT p1.name,p1.age,p1.score FROM players p1
WHERE p1.score IN (SELECT MAX(score) FROM players GROUP BY age)