
[英]How to write the following SQL query to find content with the desired tags?
[英]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.