我有一个守门员数据表,下面是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?
答案 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