如何查找以下SQL查询?

时间:2015-10-19 18:13:49

标签: sql database oracle

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

然而,我写的第二个查询给出了每个年龄段的球员列表,但是对于每个年龄段,不仅有得分最高的球员,而且在该年龄组中得分较低的其他球员。

我应该如何修复逻辑/查询代码?

谢谢!

4 个答案:

答案 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)