У меня есть две таблицы, содержащие исторические данные по всем бейсбольным играм с 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
Каков наилучший способ продолжить? Даже самый маленький запрос отнимает много времени из-за огромного количества данных.