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

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

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

谢谢!

#1楼 票数:1

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

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

#2楼 票数: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)上建立索引。 使用该索引,它应该在大型数据集上具有更好的性能。

#3楼 票数: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;

#4楼 票数: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)

  ask by user118464 translate from so

未解决问题?本站智能推荐:

3回复

调整以下查询

可以调整以下查询吗? 我可以不使用减号来写吗
3回复

SQL查询(Pro * C)如何能够找到数据库表中不存在的一组值

我有一个C / C ++程序,带有在pro c(11.2及更高版本)中的嵌入式Oracle SQL调用。 我有一个值列表(int)作为数组。 我想通过SQL查询(作为过程代码)检查哪些值不在数据库表中。 例如,我有一个值: 10, 20, 30, 40, 50存储在数组中,而我的数据库表t
1回复

如何重写没有任何子查询的SQL查询?

如何在不使用SQL子查询的情况下重写此查询? 我不太熟悉如何执行此操作,但是我认为可以通过使用“ join”来完成。 (注意:这来自电影关系(标题,年份,长度,类型,工作室名称,制片人C#))
3回复

SQL查询问题

考虑两个table.Employee和Project.Employee表有像eid,ename这样的字段。项目表有像pid,pname.Now这样的字段,因为员工可以处理很多项目而且项目可以由很多员工完成,因此,很明显b / w两个表有多对多关系。打破多对多,并创建一个名为Assignment的
2回复

SQL查询更新[关闭]

我有这个表员工的列 另一个表与列一起使用 我希望每个工作增加100个员工的工资,并且只有当工作量大于1时才更新。任何人都可以帮助我解决这个问题。 我需要一个sql更新查询(没有存储过程或触发器或游标)。
1回复

关于重构SQL查询

我有以下查询,虽然可以达到预期的结果,但是这是一个冗长的查询,请告知我还有其他方法可以重组查询..我想将此长查询减少为较小的形式
3回复

SQL查询基于Oracle

交替使用此表有些麻烦: 我的桌子是styles ( id, style ) 我需要将单词“ Style-XX”更改为Coach-XX,其中XX是偶数(0、2、4、6)。 所以看起来像这样: 好吧,我知道它必须是这样的:XX mod 2 = 0,以便数字为偶数(0、2、
5回复

SQL查询混淆

展示: 户口号码。 客户ID 初始金额(十万) (四舍五入至小数点后两位数)[将列标题更改为“ INITIALAMTIN_LAKHS”] 金额类别(amt <50000显示为“低”,amt> 5000000显示为“高”,否则为“中”)[将列标题更改为“ AMOUNT_C