4

これはMYSQLを使用 しています私の質問は次のとおりです。私は野球データベースを持っています、そしてその野球データベースにはこれまでにプレーしたすべてのプレーヤーをリストするマスターテーブルがあります。すべてのプレーヤーのバッティング統計を追跡するバッティングテーブルもあります。これら2つを結合するビューを作成しました。したがって、masterplusbattingテーブル。私は今、野球が始まって以来、10年ごとに最高のHR打者を見つけたいと思っています。これが私が試したことです。

    select f.yearID, truncate(f.yearid/10,0) as decade,f.nameFirst, f.nameLast, f.HR
    from (
    select yearID, max(HR) as HOMERS
    from masterplusbatting group by yearID
    )as x inner join masterplusbatting as f on f.yearID = x.yearId and f.HR = x.HOMERS
    group by decade

187, 188, 189の代わりにetcを取得するために、yearIDを切り捨てたことがわかります1897, 1885,。次に、10年ごとにグループ化し、10年ごとに最高になると考えましたが、正しい値が返されていません。たとえば、2004年にエイドリアンベルトレに48 HRを与えましたが、2001年にバリーボンズが73 HRに達したということは誰もが知っています。誰かが私にいくつかの指針を教えてもらえますか?

4

2 に答える 2

2
SELECT
  Lookup.DecadeID,
  Data.*
FROM
(
  SELECT
    truncate(yearid/10,0) as decadeID,
    MAX(HR) as Homers
  FROM
    masterplusbatting
  GROUP BY
    truncate(yearid/10,0)
)
  AS lookup
INNER JOIN
  masterplusbatting AS data
    ON  data.yearid >= lookup.decadeID * 10
    AND data.yearid <  lookup.decadeID * 10 + 10
    AND data.HR     =  lookup.homers

MySQL用に編集

于 2012-10-15T21:35:51.507 に答える
0

あなたのクエリは間違ったものによって集約されているようです。どこかで、プレイヤーに基づいたグループを見ることを期待しています。

select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs
from masterplusbatting mpb
group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast

これにより、10年ごとのホームランの総数がわかります。今、あなたは最も多くの人が欲しいです。このために、row_number()関数とサブクエリを使用します。

select decade, nameFirst, nameLast, HRs
from (select decade, nameFirst, nameLast, HRs,
             row_number() over (partition by decade order by HRs desc) as seqnum
      from (select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs
            from masterplusbatting mpb
            group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast
           ) t
     ) t
where seqnum = 1
order by 1

MySQLなどのデータベースでは、2番目の結合でこれを行う必要があります。

select t.*
from (select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs
      from masterplusbatting mpb
      group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast
     ) t join
     (select decade, max(HRs) as maxHRs
      from (select truncate(mpb.yearid/10, 0) as decade, mpb.nameFirst, mpb.nameLast, sum(mpb.HR) as HRs
            from masterplusbatting mpb
            group by truncate(mpb.yearid/10, 0), mpb.nameFirst, mpb.nameLast
           ) t
      group by decade
     ) tsum
     on t.decade = tsum.decade and t.HRs = tsum.maxHRs
order by decade
于 2012-10-15T21:23:28.357 に答える