不使用日期的MySql中的10期移动平均线

时间:2011-03-27 19:14:57

标签: mysql ranking moving-average

我有一个守门员数据表,下面是snipet

    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可能是他的第二场比赛,依此类推。

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

另外,有没有办法使用MySql按守门员排名游戏ID?

2 个答案:

答案 0 :(得分: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

这将仅传递一次数据,构建平均值。外部查询将简单地从此派生表中获取最小值/最大值。我现在还不准备充实它。

答案 1 :(得分: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