SQL-запрос для большой базы данных бейсбола - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть две таблицы, содержащие исторические данные по всем бейсбольным играм с 1952 года (данные ретроспективы).

Game table (all games since 1952)
    +--------+------------+
    | GameID |    Date    |
    +--------+------------+
    |BOS0102 | 2015-06-01 |
    |TOR0189 | 2015-06-01 |
    |NYY0878 | 2015-06-02 |
    |BOS0105 | 2015-06-02 |
    +--------+------------+

Event table (play by play for each game)
    +---------+----------+-----------+-----------+-----------------+
    | EventID |  GameID  | BatterID  | EventCode | IslAtBat        |
    +---------+----------+-----------+-----------+-----------------+
    |   45352 | BOS01021 | mtrout001 | 1B        | True            |
    |   45369 | BOS01021 | mtrout001 | FO        | True            |
    |   45382 | BOS01021 | mtrout001 | X2        | True            |
    |   45398 | BOS01021 | mtrout001 | X1        | True            |
    |   45458 | BOS01021 | mtrout001 | Y9        | False           |
    +---------+----------+-----------+-----------+-----------------+

Если я хочу вычислить среднее значение ватина Майка Траута за всю его карьеру:

/* Batting average = number hits / number at-bats
/* Codes that count in the batting average : 1B, 2B, 3B, HR */

SELECT SUM(Case EventCode IN(‘1B’, ‘2B’, ‘3B’, HR’) THEN 1 ELSE 0 END) AS ‘NumberHits’, 
    SUM(Case IsAtBat IS TRUE THEN 1 ELSE 0 END) as ‘NumberAtBats’,
    SELECT SUM(Case EventCode IN(‘1B’, ‘2B’, ‘3B’, HR’) THEN 1 ELSE 0 END)/SUM(Case IsAtBat IS TRUE THEN 1 ELSE 0 END) as ‘AVG’
    FROM events WHERE BatterID = ‘mtrout001’ 

Я бы хотел сделать следующее:

Для каждой игры в игровом столе вычислите среднее значение всех биттеров за последние 25 бит за до игры и вставьте результат в новую таблицу:

+----------+------------+-------------------+
|  GameID  |  BatterID  | Last25AtBatAverage|
+----------+------------+-------------------+
| BOS01021 | mtrout001  | .352              |
| BOS01021 | jdoe001    | .212              |
| BOS01021 | mjohnson   | .119              |
| BOS01021 | yhong001   | .326              |
| BOS01021 | rthoip001  | .280              |
| BOS01021 | qwillis001 | .096              |
| BOS01021 | agort001   | .257              |
| BOS01021 | bmay001    | .418              |
| BOS01021 | yhong001   | .326              |
| STL03023 | pdupuis001 | .256              |
| STL03023 | jwarren001 | .228              |
+----------+------------+-------------------+

Это говорит мне о том, что для его последних 25 летучих мышей перед игрой 2015-06-01 в Бостоне среднее значение бита для Майка Траута составляло .352

Каков наилучший способ продолжить? Даже самый маленький запрос отнимает много времени из-за огромного количества данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...