Нужна помощь с запросом MySQL для получения средних результатов за год y и y + 1 - PullRequest
0 голосов
/ 11 февраля 2011

У меня есть запрос MySQL:

SELECT px.player, px.pos, px.year, px.age, px.gp, px.goals, px.assists
    , 1000 - ABS(p1.gp - px.gp) - ABS(p1.goals - px.goals) - ABS(p1.assists - px.assists) sim
 FROM hockey p1
 JOIN hockey px
   ON px.player <> p1.player
 WHERE p1.player = 'John Smith'
  AND p1.year = 2010
  HAVING sim >= 900
  ORDER BY sim DESC

Это дает мне таблицу результатов, что-то вроде этого:

player  pos year    age gp  goals   assists sim
Player1 LW  2002    25  75  29  32  961
Player2 LW  2000    27  82  29  27  956
Player3 RW  2000    27  78  29  33  955
Player4 LW  2009    26  82  30  30  940
Player5 RW  2001    25  79  33  24  938
Player6 LW  2008    25  82  23  24  936
Player7 LW  2006    27  79  26  33  932

Вместо этого я хотел бы сделать две вещи.Усредните данные и добавьте количество игроков, чтобы я получил что-то вроде:

players age gp  goals   assists sim
7   26  79  28  29  945

Я пробовал avg (px.age), avg (px.gp), avg (px.goals) ... и т. Д.но я сталкиваюсь с ошибками с моей формулой "sim".

Вторая проблема заключается в том, что под этим я хотел бы получить среднее значение данных за СЛЕДУЮЩИЙ год.Другими словами, данные из Player1 в 2003 году, данные из Player2 в 2001 году и т. Д.

Я застрял в том, КАК получить средние данные И получить их на следующий год.

Может ли кто-нибудь помочь мне с одним или обоими этими вопросами?

Ответы [ 2 ]

1 голос
/ 11 февраля 2011

Чтобы получить единую промежуточную сумму подсчетов и средних значений, просто оберните исходный запрос КАК внутренний выбор ... что-то вроде ... (pq = "PreQuery" результат выбора)

Select 
      max( "Tot Players" ) Players,
      max( "->" ) position,
      count(*) Year,
      avg( pq.age ) AvgAge,
      avg( pq.gp ) AvgGP,
      avg( pq.goals ) AvgGoals,
      avg( pq.assists ) AvgAssists,
      avg( pq.sim ) AvgSim
   from 
      ( SELECT 
             px.player, 
             px.pos, 
             px.year, 
             px.age, 
             px.gp, 
             px.goals, 
             px.assists,
             1000 - ABS(p1.gp - px.gp) 
                  - ABS(p1.goals - px.goals) 
                  - ABS(p1.assists - px.assists) sim  
          FROM 
             hockey p1
                JOIN hockey px ON px.player <> p1.player  
          WHERE 
                 p1.player = 'John Smith'   
             AND p1.year = 2010   
          HAVING 
             sim >= 900
          ORDER BY 
             sim DESC ) pq

Если ваш исходный запрос сработал, вы должны получить ваши общие средние значения. Однако с запросом INNER, имеющим порядок и порядок, может возникнуть проблема. Возможно, вам придется убить порядок, поскольку в самом внешнем запросе он не имеет значения. Что касается предложения HAVING в запросе INNER, может потребоваться переместить его в WHERE pq.sim> = 900 в OUTER SQL-Select.

Кроме того, если вы хотите, чтобы результаты всех игроков были первыми, ТОГДА итого, возьмите исходный запрос и объедините его с этим ... Как вы увидите, чтобы синхронизировать столбцы с ОБА запросами, я мы поставили фальшивку для игрока и позиции, чтобы она не рухнула на несовпадающие союзы ... Обратите внимание, что мой столбец COUNT фактически будет соответствовать столбцу YEAR в ОРИГИНАЛЬНОМ запросе.

За предыдущий год ... Как упоминал Роб, вы просто выполняете СОЮЗ из двух запросов, просто показывая соответствующий год, в котором вы проходили отбор в каждом СОЮЗЕ ...

РЕДАКТИРОВАТЬ --- РАЗЪЯСНЕНИЕ на 2-й ГОД ....

Согласно вашему последующему пояснению к комментарию, вы должны будете получить основу в качестве основы для года +1 ... если вы затем захотите снова получить общие средние значения, они будут перенесены во внешний max / avg и т. Д. Но я думаю, что это то, что вы хотите в следующем году на игрока

SELECT
      PrimaryQry.PrimaryPlayer,
      PrimaryQry.PrimaryPos,
      PrimaryQry.PrimaryYear,
      PrimaryQry.PrimaryAge,
      PrimaryQry.PrimaryGP,
      PrimaryQry.PrimaryGoals,
      PrimaryQry.PrimaryAssists,
      PrimaryQry.player,
      PrimaryQry.pos,
      PrimaryQry.year,
      PrimaryQry.age,
      PrimaryQry.gp,
      PrimaryQry.goals,
      PrimaryQry.assists,
      PrimaryQry.sim,
      p2.pos  PrimaryPos2,
      p2.year PrimaryYear2,
      p2.age  PrimaryAge2,
      p2.gp   PrimaryGP2,
      p2.goals PrimaryGoals2,
      p2.assists PrimaryAssists2,
      px2.player player2,
      px2.pos pos2,
      px2.year year2,
      px2.age age2,
      px2.gp gp2,
      px2.goals goals2,
      px2.assists assists2,
      1000 - ABS(p2.gp - px2.gp)
           - ABS(p2.goals - px2.goals)
           - ABS(p2.assists - px2.assists) sim2
  FROM
      ( SELECT
             p1.player PrimaryPlayer,
             p1.pos PrimaryPos,
             p1.year PrimaryYear,
             p1.age PrimaryAge,
             p1.gp PrimaryGP,
             p1.goals PrimaryGoals,
             p1.assists PrimaryAssists,
             px.player,
             px.pos,
             px.year,
             px.age,
             px.gp,
             px.goals,
             px.assists,
             1000 - ABS(p1.gp - px.gp)
                  - ABS(p1.goals - px.goals)
                  - ABS(p1.assists - px.assists) sim             
         FROM
             hockey p1
               JOIN hockey px 
                  ON p1.player <> px.player
         WHERE
                 p1.player = 'John Smith'
             AND p1.year = 2010
         HAVING
             sim >= 900 ) PrimaryQry
         JOIN hockey p2
             ON PrimaryQry.PrimaryPlayer = p2.player
            AND PrimaryQry.PrimaryYear +1 = p2.year
         JOIN hockey px2
             ON PrimaryQry.Player = px2.Player
            AND PrimaryQry.Year +1 = px2.year

Если вы будете следовать логике здесь, вы уже знаете, что внутренний запрос возвращает около 10 других игроков. Итак, я веду статистику от первого лица в этом запросе тоже. ПОТОМ, я присоединяюсь к этому результату обратно к хоккейной таблице ДВАЖДЫ ... Объединение - это основной игрок, присоединившийся к первому за его / ее год +1, ВТОРОЕ объединение работает специально с одним человеком, который квалифицирован против основного игрока. В итоговых результатах столбца указывается квалификатор первого года со вторым классификатором, например

So, it will all be on one row consecutively of 
John Smith 2010   Compare Person 1 YearA  John Smith 2011   Compare Person 1 YearA+1
John Smith 2010   Compare Person 2 YearB  John Smith 2011   Compare Person 2 YearB+1
John Smith 2010   Compare Person 3 YearC  John Smith 2011   Compare Person 3 YearC+1
0 голосов
/ 11 февраля 2011

Какой запрос вы используете, чтобы получить средние значения?

Простое применение «AVG» к выражению «sim» должно работать в mysql.например,

AVG(1000 - ABS(p1.gp - px.gp) - ABS(p1.goals - px.goals) - ABS(p1.assists - px.assists)) sim

Для агрегации за разные годы, я думаю, нет альтернативы использованию подвыбора или объединения.

Ссылка:

Что-то вроде:

(ORIGINAL AVG QUERY) 
UNION ALL 
(ORIGINAL AVG QUERY WITH NEW YEAR)

должен сделать свое дело.

(Обратите внимание, что ваш исходный запрос выбирает данные из каждого года, чтобы сравнить их с данными для Джона Смита в 2010 году, что может не соответствовать вашим ожиданиям.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...