2012-03-16 109 views
6

我有一些表格,其中包含有關玩家的數據以及他們在聯賽期間在保齡球中心擊球的比賽數據。這個特定的查詢用於排序今年男性和女性的前X平均數。我把所有這一切都放下了,但是在某些特定情況下,當一些球員在多個聯賽中打球時,他們的平均數在頂部X中不止一個。在SQL查詢中獲得每個不同記錄的最大平均值

顯然,我只想列出最好的所以如果玩家A在ABC聯盟中擁有200的最佳平均水平,並且在聯盟DEF中擁有198的第二高平均水平,那麼我只想要200名玩家。

下面是我想要更改的查詢的簡化版本,因爲現在我必須手動刪除重複項,或者我必須用另一種語言編寫分揀機,但我寧願在純SQL中執行。 (I僅除去從查詢這個例子不相關的信息):

SELECT playerId, ROUND(AVG(score),2)Average, season, leagueName, COUNT(score)NumGames FROM Scores 
WHERE season = '2011-2012' AND score > -1 
GROUP BY season, playerID, leagueName 
ORDER BY Average DESC LIMIT 0,30 

基本上,Scores表包含每個單獨的遊戲,playerId,其中游戲被演奏季節和leagueName(和其他列,其在本例中不需要)。

WHERE是爲了確保遊戲是在本賽季進行的,並且得分爲正(-1表示人在缺席時)。我按賽季,球員ID和聯盟名稱對所有內容進行了分組,所以我得到了每名球員的平均PER LEAGUE,而不是不同聯賽中所有比賽的平均水平。

我嘗試使用DISTINCT關鍵字,但這不起作用,因爲我不能僅將DISTINCT用於單列。我也試過其他的東西,但他們都沒有接近工作,所以我想知道是否有可能做到這一點,或者如果我不得不求助於使用另一種語言排序這個結果集和刪除重複?

回答

3

你可以計算出每個玩家每聯盟平均的子查詢:

select playerId 
,  max(league_avg.score) 
from (
     select playerId 
     ,  avg(score) as score 
     from Scores 
     where season = '2011-2012' 
       and score > -1 
     group by 
       playerId 
     ,  leagueName 
     ) as league_avg 
group by 
     playerId 
+0

非常好,這是我的首選答案,因爲它在單個查詢中工作而不需要臨時表。萬分感謝! – 2012-03-16 17:01:57

1

好的,這是一個挑戰。我假設你可以使用SELECT xxx INTO表生成臨時表?在這種情況下,這兩個選擇會得到你想要的:

首先,我假設你的查詢上面做了一個名爲tmpscores的表。

然後,你需要得到的,每個球員,成績最好:

select playerID, MAX(average) AS bestscore 
INTO bestscores 
FROM tmpscores 
GROUP BY playerID, season 

最後,採取bestscores和重新加入臨時成績獲得遊戲的正確聯賽和數量:

SELECT bs.playerId, bs.bestscore, ts.season, ts.leaguename, ts.numgames 
    FROM bestscores bs 
    JOIN tmpscores ts ON bs.playerID = ts.playerId and bs.bestscore = ts.average 

有!全部在SQL中。

希望它有幫助!

+0

這是偉大的,我懂了工作,但我不得不改變一些事情。我用我的問題中的查詢創建了tmpScores,然後使用您的第一個SQL查詢減去「INTO bestScores」,並在SELECT中添加了我需要的字段,因爲tmpScores已經包含了我需要的所有數據。謝謝你,這真的幫了我:) – 2012-03-16 16:51:54

+0

很高興它爲你工作@亞當! – 2012-03-16 16:54:56