我有一个 PostgreSQL 9.4.1 数据库(Retrosheet 数据),其中的表格events
包含每个棒球比赛的一行。我想计算给定球员的连续击球平均值:公式是(到目前为止的击球总数)/(到目前为止的有效击球总数)。
我可以使用窗口函数来获取播放器代码为 的 David Ortiz 的运行总命中数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'
,我会计算两个函数:描述击球的所有先前行的计数,以及描述命中的所有先前行的计数。将这些除以该行的连续击球率。