2015-10-19 93 views
0

SQL數據庫中有一個表,名爲Players: 玩家(ID,姓名,年齡,性別,分數) 其中ID是主鍵。如何查找以下SQL查詢?

現在我想寫一條查詢來查找下面的結果: 對於每個年齡段,查找這個年齡段所有玩家中得分最高的玩家的名字和年齡。

我寫了下面的查詢:

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 

不過,我寫的第二個查詢給人的球員,每個年齡列表,但每個年齡段,不僅有最高的玩家得分,還有其他球員在這個年齡組內得分較低。

我應該如何解決我的邏輯/查詢代碼?

謝謝!

回答

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)上的索引。使用該索引,這應該在大型數據集上具有更好的性能。

+0

我明白了,現在效果很好,謝謝! – user118464

1

您可以使用rank來執行此操作。

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

謝謝!我把上面的查詢放到Oracle服務器上,它說「無效的SQL,不允許的!」......另外,有什麼辦法可以避免「排名」?非常感謝! – user118464

+0

您正在使用哪個版本的Oracle? –

+0

@ user118464:這絕對是Oracle的有效SQL查詢。並且「不允許」是**不是**有效的Oracle錯誤消息。您是否確定*您正在使用Oracle?你得到的**確切**錯誤信息是什麼?您也不會「查詢到Oracle服務器」 - 您使用SQL客戶端運行它。你正在使用哪個SQL客戶端?在SQL * Plus? SQL Developer?還有別的嗎? –

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; 
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)