我正在使用拉赫曼的棒球数据库和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。
答案 0 :(得分:1)
<强>计划强>
- 创建表格,显示所有位置的玩家总数
- 从此表中获取最大的职位总数
- 加入返回以获得相应的主要职位
醇>
<强>查询强>
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;