1

我有一个守门员数据表,下面的片段

    year    gameid  player  sv% gamenum
2009    200165  John Smith  0.923   0165
2009    209754  John Smith  1.000   9754
2009    206938  John Smith  1.000   6938
2009    206155  John Smith  0.833   6155
2009    203021  John Smith  0.667   3021
2009    206472  John Smith  0.909   6472
2009    209524  John Smith  0.833   9524
2009    209351  John Smith  0.800   9351
2009    203056  John Smith  1.000   3056
2009    206761  John Smith  0.935   6761
2009    200466  John Smith  0.954   0466
2009    204171  John Smith  0.932   4171
2009    207876  John Smith  0.958   7876
2009    201581  John Smith  0.941   1581
2009    205286  John Smith  0.930   5286
2009    208991  John Smith  0.961   8991
2009    202696  John Smith  0.916   2696
2009    206401  John Smith  0.935   6401
2009    200106  John Smith  0.921   0106
2009    201381  John Smith  0.918   1381

我想获取每个守门员的 10 场比赛移动平均值,但我没有日期或比赛编号,例如他的第一场、第二场、第三场比赛等。比赛 ID 也按照在联赛中的顺序分配级别,因此第 200106 场比赛可能是他本赛季的第一场比赛,而 200165 场可能是他的第 2 场比赛,以此类推。

我的问题是:如何获得每个守门员每年分组的最大(10 场比赛移动平均)和最小(10 场比赛移动平均)?

另外,有没有办法使用 MySql 按守门员、年份对游戏 ID 进行排名?

4

2 回答 2

1

10 场比赛移动平均意味着如果您的比赛少于 10 场,则没有有意义的平均值(没有足够的比赛)。如果您有 12 场比赛,则取平均值

1-10 (avg)
2-11 (avg)
3-12 (avg)
max / min across the 3 averages

在 MySQL 中执行此操作的最有效方法是

select .. (involving 13 @variables to rownumber and rotate the last
           10 values into the variables, keeping track of
           @player, @year, @rownumber)
order by player, year, gameid

这将只通过数据一次,建立平均值。外部查询将简单地从此派生表中获取最小值/最大值。不过,我目前还没有准备好充实这一点。

于 2011-03-27T20:23:52.530 回答
0

这是一个想法(公平警告:未测试)

SELECT max(mavg) FROM 
(SELECT (SELECT avg(avgfield),min(gamenum) as gn FROM YourTable g WHERE g.gamenum>t.gamenum LIMIT 10),t.gamenum 
       FROM
       YourTable t
) d

或者

SELECT max(mavg) FROM 
(SELECT t.gamenum FROM
       YourTable t INNER JOIN 
       (SELECT avg(avgfield),min(gamenum) as gn FROM YourTable g WHERE g.gamenum>t.gamenum LIMIT 10) q  ON q.gn = t.gamenum
) d
于 2011-03-27T19:28:32.060 回答