基于1952年以来Retrosheet棒球双表的大型数据库SQL查询需求
嘿,我来帮你搞定这个Retrosheet棒球数据库的SQL查询需求~先把两张核心表的结构理清楚,再给你几个实用的查询示例:
核心表结构说明
1. 比赛表(存储1952年以来全部赛事信息)
这张表是赛事的主表,记录每场比赛的基础标识信息,样例数据如下:
| GameID | Date |
|---|---|
| BOS0102 | 2015-06-01 |
| TOR0189 | 2015-06-01 |
| NYY0878 | 2015-06-02 |
| BOS0105 | 2015-06-02 |
GameID:每场比赛的唯一标识符Date:比赛举办日期
2. 事件表(存储每场赛事的逐次投打记录)
这张表是赛事的细节表,记录每一次投打动作的具体信息,表结构如下:
| EventID | GameID | BatterID | EventCode | IslAtBat |
|---|
EventID:每一次投打事件的唯一IDGameID:关联比赛表的赛事标识,用来关联到具体场次BatterID:参与投打事件的打者唯一IDEventCode:事件类型编码(比如安打、三振、保送等,对应Retrosheet的标准编码规则)- 注:字段名
IslAtBat推测是IsAtBat(标识该事件是否构成一次有效打席)的笔误,实际使用时可根据数据库实际定义调整
实用SQL查询示例
示例1:查询指定日期的所有赛事及对应投打事件总数
如果想知道某一天所有比赛的投打活跃度,用这个查询:
SELECT g.GameID, g.Date, COUNT(e.EventID) AS TotalPlayEvents FROM 比赛表 g LEFT JOIN 事件表 e ON g.GameID = e.GameID WHERE g.Date = '2015-06-01' GROUP BY g.GameID, g.Date ORDER BY TotalPlayEvents DESC;
示例2:统计指定时间段内每个打者的有效打席数
假设IslAtBat取值为1代表有效打席,统计2015年6月每个打者的总有效打席数:
SELECT e.BatterID, COUNT(e.EventID) AS ValidAtBats FROM 事件表 e JOIN 比赛表 g ON e.GameID = g.GameID WHERE g.Date BETWEEN '2015-06-01' AND '2015-06-30' AND e.IslAtBat = 1 GROUP BY e.BatterID ORDER BY ValidAtBats DESC;
示例3:查询单场比赛的所有投打事件详情
想深挖某一场比赛的每一次投打细节,用这个查询:
SELECT e.EventID, e.BatterID, e.EventCode, e.IslAtBat, g.Date FROM 事件表 e JOIN 比赛表 g ON e.GameID = g.GameID WHERE e.GameID = 'BOS0102' ORDER BY e.EventID;
内容的提问来源于stack exchange,提问作者Max
相关产品推荐
相关产品推荐

