У меня есть база данных PostgreSQL 9.4.1 (данные Retrosheet) с таблицей events
, содержащей одну строку для каждой игры в бейсбол. Я хочу вычислить текущее среднее значение для данного игрока: формула (общее количество попаданий на данный момент)/(общее количество действительных летучих мышей на данный момент).
Я могу использовать оконные функции, чтобы получить общее количество попаданий для Дэвида Ортиса, чей код игрока ortid001
, используя следующий запрос:
SELECT count(*) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM events WHERE bat_id='ortid001' AND (event_cd='20' OR event_cd='21'
OR event_cd='22' OR event_cd='23');
(Предложение, включающее event_cd
, просто определяет, какие строки считаются совпадениями.)
Используя тот же метод, я могу получить промежуточное количество at-bats (предложение event_cd
отклоняет каждую строку, которая не считается at-bat. обратите внимание, что выбранные выше совпадения являются подмножеством at-bats):
SELECT count(*) OVER (ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW)
FROM events WHERE bat_id='ortid001' AND (event_cd != '11' AND
event_cd!='14' AND event_cd!='15' AND event_cd!='16' AND
event_cd!='17');
Как я могу совместить это? В идеале для каждой строки, описывающей игру с bat_id='some_player_id'
, я должен вычислить две функции: количество всех предыдущих строк, описывающих биту, и количество всех предыдущих строк, описывающих попадания. Разделив их, вы получите текущее среднее значение в этом ряду.