MYSQL

2016-04-23 4 views
0

の各年の平均値を示す行のリストを取得しましたので、 MYSQL - get a row for each year, with total sum for each monthのような鉱山に似た質問が多数見つかりましたが、私は別の方法を探していました。私はラーマンのデータベースを使用しており、毎年WARによるトップ10選手を探しています。私はその年齢の平均年齢を与えるために年齢を選んだプレーヤーを平均しています。私は毎年これをやろうとしていますが、私はそれをやる方法に固執しています。MYSQL

SELECT AVG(t.age) As AverageAge, w.yearID 
    FROM (SELECT w.playerID, w.age 
    From war_batting w, Master m 
    WHERE w.playerID = m.playerID AND w.yearID = 2012 
    ORDER by w.WAR desc 
    LIMIT 10) t, 
war_batting w; 

私は季節ごとのためにそれを行うために探していますので、これはそのシーズンのトップ10選手の平均を表示します。私がリンクしている記事では、彼らが必要とするすべての価値についてそれをしているのを見ていますが、私はほぼ150年間同じコードを繰り返さない方法を探しています。私はJavaとC++でプログラミングしてきました。当然のことながら、私は自分のものをループする方法を探していますし、現在の年までIDを1に増やしています。私はちょうどこれを行う方法を理解するために苦労しています。上記のコードでは、2012年ではなく2004年としてyearIDが返されますが、他のテストでもそうだと確信していますので、私はそれを修正する能力に自信があります。また、私が最初に投稿したときにコードブロックがうまく出てこない場合は、これが私の最初の投稿であるので、修正しようとします。それに参加する必要はありませんので、あなたはmasterテーブルから何も選択していない

答えて

0

..

は、以下のクエリをお試しください。これには、ユーザー定義変数を使用してWAR降下に基づいてランク付けする内部問合せがあります。次に、外側のクエリは、< = 10のランクしか調べていないので、yearIDでグループ化している間平均します。

SELECT AVG(T.age) AS AverageAge, T.yearID 
FROM 
    (SELECT w.playerID, w.age, w.yearID, 
     CASE WHEN @prev_year = yearID THEN @rank := @rank+1 
     ELSE @rank:=1 
     END as rank, 
     @prev_year := yearID 
    FROM war_batting w 
    ORDER BY yearID ASC, WAR DESC 
    )T 
WHERE T.rank <= 10 
GROUP BY T.yearID 

sqlfiddle

あなたは自分のクエリの最後にORDER BY T.yearID DESCORDER BY T.yearID ASCを追加し、150年の各年の同じコードを実行せずに、すべての結果を得ることができるこの方法。

+0

マスターは別のコードから残っていましたが、はい、私はそれを必要としません。あなたのサンプルに関しては年を経るが、毎年の平均年齢の値はすべて間違っている。なぜ私は確信していませんが、私は私が必要なものを得るためにこれで作業できるかどうかを見ていきます。 – ATV360

+0

私は正直なところは分かりませんが、w.playerID = m.playerIDをwhereステートメントで削除すると、1年だけの値を検出するテストでは、number 1のプレーヤーの年齢が返されます。この10人の選手を見せても、彼には10回だけ表示されます。 – ATV360

+0

このステートメントとマスターテーブルをプログラムに追加してみましたが、今は完全に機能しています。私はまだそれがなぜこの方法で動作するのか完全には分かっていないが、あなたの助けを借りてありがとう! – ATV360