10-периодная скользящая средняя в MySql без использования даты

У меня есть таблица данных вратарей, снипет ниже

    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 скользящих средних значений для каждого вратаря, но у меня нет дат или номеров игр, таких как его первая, вторая, третья игра и т. Д. Идентификаторы игр также назначаются в том порядке, в котором они играются в лиге. уровень, поэтому игра 200106 может быть его первой игрой в сезоне, а игра 200165 - второй и так далее.

Мой вопрос: как я могу получить максимальное (10 игровых скользящих средних) и минимальное (10 игровых скользящих средних), сгруппированных по каждому вратарю за каждый год?

Кроме того, есть ли способ ранжировать идентификаторы игр по вратарям, годам с помощью MySql?


person NeilG    schedule 27.03.2011    source источник


Ответы (2)


Скользящее среднее из 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

При этом данные будут переданы только один раз, и будут построены средние значения. Внешний запрос просто берет минимум / максимум из этой производной таблицы. Я не собираюсь вдаваться в подробности в данный момент.

person RichardTheKiwi    schedule 27.03.2011

Это одна идея (справедливое предупреждение: не проверено)

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

or

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
person dfb    schedule 27.03.2011
comment
Спасибо. Я получаю сообщение об ошибке: каждая производная таблица должна иметь собственный псевдоним - person NeilG; 28.03.2011
comment
См. Правки, каждый подзапрос должен быть назван, а самый внешний запрос не был - person dfb; 28.03.2011