ボウリング センターで、すべての最高の平均値を降順で並べ替えるために使用されるクエリがあります。
プレーヤーが2つの異なるリーグでプレーする場合(または、各シーズンの後に平均がリセットされるため、シーズンごとにグループ化しない場合)を除いて、すべてがうまく機能します。 . (同じプレーヤーの異なるリーグでの平均は累積されないため、1 人のプレーヤーが複数の平均を持つことができます)
少し前に Stack Overflow で質問したところ、その問題は解決したと思っていましたが (こちら)、最近、クエリに問題があることがあると言われました。
問題は、重複した名前を取得せず、正しい MAX 平均を取得しても、プレーヤーが複数のリーグでプレーする場合、leagueName、プレイしたゲーム数、シーズンなどの他の列が常に正しいとは限らないことです。 . クエリは次のとおりです。
SELECT PlayerID, Name, max(score)Avg, gamesCount, LeagueName, Season
FROM( SELECT PlayerID, Player.Name as Name, Player.Gender as Gender, ROUND(AVG(score),2) as score, COUNT(score) as gamesCount, LeagueName, Season
FROM Scores JOIN Players as Player USING(PlayerID)
WHERE Score > -1 AND bowlout = 'No' AND season = '2011-2012'
GROUP BY PlayerID, LeagueName, Season
HAVING gamesCount >= 50
) as league_avg
WHERE Gender = 'Male'
GROUP BY PlayerID
ORDER BY Avg DESC LIMIT 0,50;
明らかに、外部クエリは PlayerID によってのみグループ化されるため、機能しません。したがって、プレーヤーの最大 AVG を取得しますが、プレーヤーが複数のリーグに参加している場合、leagueName などの他のフィールドはランダムに選択されます。彼がプレーするリーグ。
私が望むのは、プレーヤーと彼の最大平均に対応するリーグ名 (およびその他すべての情報) を取得することです。
次に例を示します。
Name | AVG | LeagueName
Jones, Tom 122.56 Friday League
Smith, Adam 182.42 Super League
Smith, Adam 194.25 Friendly League
...
期待される結果は次のようになります。
Name | AVG | LeagueName
Smith, Adam 194.25 Friendly League
Jones, Tom 122.56 Friday League
私が得ているもの:
Name | AVG | LeagueName
Smith, Adam 194.25 *Super League*
Jones, Tom 122.56 Friday League
ご覧のとおり、Smith、Adam は正しい AVG を持っていますが、Name/Avg コンボに関連付けられたリーグは間違っています。
外部の GROUP BY 句を PlayerID、LeagueName、Season に変更しようとしましたが、シーズンごとにリーグごとに再分離され、重複が再び返されます。これが含まれているJavaアプリケーションを使用して、すべての結果を取得し、Javaで重複を削除する以外に、何を試すべきかわかりません。明らかに、私は SQL クエリから初めて正しい結果を得たいと思っています。
補足として、この投稿の前半で言及されていましたが、クエリに「AND シーズン = '2011-2012'」の部分がない場合があるため、異なるシーズンで同じプレーヤーの重複を取得してはなりません。
編集:一部の人がタグに気付かなかった場合に備えて、SQLiteを使用しています。