繁体   English   中英

如何找到以下SQL查询?

[英]How to find the following SQL query?

SQL数据库中有一个表,称为玩家:玩家(ID,姓名,年龄,性别,得分),其中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

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

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

谢谢!

您可以使用rank来做到这一点。

select name, age
from (
SELECT *, 
rank() over(partition by age order by score desc) rnk
FROM Players) t
where rnk = 1

您原来的查询非常接近。 您只需要将子查询更改为相关子查询并删除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)上建立索引。 使用该索引,它应该在大型数据集上具有更好的性能。

您也可以尝试。

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;

试试看,这将解决您的问题:

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM