10-периодная скользящая средняя в MySql без использования даты - PullRequest
1 голос
/ 27 марта 2011

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

    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?

Ответы [ 2 ]

1 голос
/ 28 марта 2011

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

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

0 голосов
/ 27 марта 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

или

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...