You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于1952年以来Retrosheet棒球双表的大型数据库SQL查询需求

嘿,我来帮你搞定这个Retrosheet棒球数据库的SQL查询需求~先把两张核心表的结构理清楚,再给你几个实用的查询示例:

核心表结构说明

1. 比赛表(存储1952年以来全部赛事信息)

这张表是赛事的主表,记录每场比赛的基础标识信息,样例数据如下:

GameIDDate
BOS01022015-06-01
TOR01892015-06-01
NYY08782015-06-02
BOS01052015-06-02
  • GameID:每场比赛的唯一标识符
  • Date:比赛举办日期

2. 事件表(存储每场赛事的逐次投打记录)

这张表是赛事的细节表,记录每一次投打动作的具体信息,表结构如下:

EventIDGameIDBatterIDEventCodeIslAtBat
  • EventID:每一次投打事件的唯一ID
  • GameID:关联比赛表的赛事标识,用来关联到具体场次
  • BatterID:参与投打事件的打者唯一ID
  • EventCode:事件类型编码(比如安打、三振、保送等,对应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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:51:06