【问题标题】:How to find the following SQL query?如何找到以下 SQL 查询?
【发布时间】:2015-10-19 18:13:49
【问题描述】:

SQL 数据库中有一个表,名为 Players: 球员(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

但是,我写的第二个查询给出了每个年龄段的玩家列表,但是对于每个年龄段,不仅有得分最高的玩家,还有该年龄段内其他得分较低的玩家。

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

谢谢!

【问题讨论】:

    标签: sql database oracle


    【解决方案1】:

    您可以使用rank 来执行此操作。

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

    【讨论】:

    • 谢谢!我将上述查询放入 Oracle 服务器,它显示“无效的 SQL。不允许!”...另外,有什么方法可以避免“排名”吗?非常感谢!
    • 您使用的是哪个版本的 Oracle?
    • @user118464:这绝对是 Oracle 的有效 SQL 查询。而“不允许”是不是有效的 Oracle 错误消息。您确定您使用的是 Oracle 吗?您收到的确切错误消息是什么?您也不会“将查询放入 Oracle 服务器”——您使用 SQL 客户端运行它。您使用的是哪个 SQL 客户端? SQL*Plus? SQL开发者?还有什么?
    • 我真的不知道,因为它是其他人根据他们的 Oracle 服务器设置的 Web 界面。我将查询放入 Web 界面,它给我的错误消息如下:“无效的 SQL。不允许!”
    【解决方案2】:

    您的原始查询非常接近。您只需要将子查询更改为相关子查询并删除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】:

      你也可以试试。

      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】:

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

        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)
        

        【讨论】:

          猜你喜欢
          • 2022-08-04
          • 2020-07-13
          • 2021-05-01
          • 2014-03-18
          • 2021-12-28
          • 1970-01-01
          • 1970-01-01
          • 2017-03-04
          • 2015-02-01
          相关资源
          最近更新 更多