拉赫曼的棒球数据库 - 确定主要位置

时间:2015-08-01 00:44:46

标签: mysql

我正在使用拉赫曼的棒球数据库和MySQL来确定每个玩家的主要位置。目标是编写一个查询,返回玩家ID和他们玩大多数游戏的位置。我知道我可能想要一个看起来像这样的查询:

select playerID, sum(G)
from fielding
where POS = 'C'
group by playerID
order by sum(G) desc;

以上查询收集了每个玩家作为捕手玩的所有游戏。我想做的是让每个玩家比较每个位置的比赛总和,并从中找到最大值。

如果您不熟悉拉赫曼的棒球数据库,请点击以下链接:http://www.seanlahman.com/baseball-archive/statistics/

此处还有Fielding表的create table语句:

CREATE TABLE `Fielding` (
  `playerID` varchar(9) NOT NULL DEFAULT '',
  `yearID` int(11) NOT NULL DEFAULT '0',
  `stint` int(11) NOT NULL DEFAULT '0',
  `teamID` varchar(3) DEFAULT NULL,
  `lgID` varchar(2) DEFAULT NULL,
  `POS` varchar(2) NOT NULL DEFAULT '',
  `G` int(11) DEFAULT NULL,
  `GS` int(11) DEFAULT NULL,
  `InnOuts` int(11) DEFAULT NULL,
  `PO` int(11) DEFAULT NULL,
  `A` int(11) DEFAULT NULL,
  `E` int(11) DEFAULT NULL,
  `DP` int(11) DEFAULT NULL,
  `PB` int(11) DEFAULT NULL,
  `WP` int(11) DEFAULT NULL,
  `SB` int(11) DEFAULT NULL,
  `CS` int(11) DEFAULT NULL,
  `ZR` double DEFAULT NULL,
  PRIMARY KEY (`playerID`,`yearID`,`stint`,`POS`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

Fielding表按年份组织。 POS是位置,G是他们在相应年份中在该位置玩的游戏数量。这意味着同一些球员将会有多次参加比赛。此外,忽略POS ='OF'时的情况,因为它取得了在给定年份中在LF,CF和RF上玩的所有游戏的总和。

对于每个不同的玩家,最终输出应该是一行,其中列为playerID和primaryPosition。

2 个答案:

答案 0 :(得分:1)

<强>计划

  
      
  1. 创建表格,显示所有位置的玩家总数
  2.   
  3. 从此表中获取最大的职位总数
  4.   
  5. 加入返回以获得相应的主要职位
  6.   

<强>查询

create table psums as 
(
  select playerID, POS, sum(G) as sm
  from Fielding 
  where POS <> 'OF'
  group by playerID, POS 
)
;

select ps.playerID, ps.POS as primaryPosition
from
(
  select playerID, max(sm) mx
  from psums
  group by playerID
) maxs
inner join
psums ps
on  maxs.playerID = ps.playerID
and maxs.mx       = ps.sm
order by ps.playerID
;

[添加限制10]

<强>输出

+-----------+-----------------+
| playerID  | primaryPosition |
+-----------+-----------------+
| aardsda01 | P               |
| aaronha01 | RF              |
| aaronto01 | 1B              |
| aasedo01  | P               |
| abadan01  | 1B              |
| abadfe01  | P               |
| abadijo01 | 1B              |
| abbated01 | 2B              |
| abbeybe01 | P               |
| abbeych01 | P               |
+-----------+-----------------+

答案 1 :(得分:0)

SELECT x.*
  FROM fielding x
  JOIN 
     ( 
       SELECT playerid
            , MAX(g) max_g 
         FROM fielding 
        GROUP 
           BY playerid 
     ) y
    ON y.playerid = x.playerid
   AND y.max_g = x.g
 LIMIT 10;

...或者,更有可能......

SELECT x.*
  FROM 
     ( SELECT playerid,pos,SUM(g) sum_g FROM fielding GROUP BY playerid,pos ) x
  JOIN
     (
       SELECT playerid
            , MAX(sum_g) max_sum_g 
         FROM 
            ( SELECT playerid
                   , pos
                   , SUM(g) sum_g 
                FROM fielding 
               GROUP 
                  BY playerid
                   , pos
            ) n
        GROUP
           BY playerid
     ) y
    ON y.playerid = x.playerid
   AND y.max_sum_g = x.sum_g
 LIMIT 10;