Объединение агрегированных сгруппированных значений со значениями для каждой строки в зависимости от условий - PullRequest
0 голосов
/ 17 июня 2019

Я хочу сравнить сгруппированные по значениям значения отдельных строк.

По сравнению с вопросом, на который мне ответили 2 дня назад Создание 2 столбцов для 2 разных групп по функциям в одной таблице , теперь я хочу иметь возможность рассчитывать только среднюю оценку для значений даты, которые ниже значения даты для конкретной строки.

Представьте себе следующую таблицу (называемую game_team_rating)

team_id  match_performance_rating    opponent_rating         date
    1            500                      700                2019-05-01
    1            400                      625                2019-05-02
    2            600                      400                2019-05-02
    3            500                      525                2019-05-03
    2            400                      200                2019-05-03

Конечный результат теперь должен выглядеть примерно так:

 team_id   date           match_pr       avg_over_500    avg_less_500
    1      2019-05-01      500             Null               Null
    1      2019-05-02      400             500                Null
    2      2019-05-02      600             Null               Null
    3      2019-05-03      500             Null               Null
    2      2019-05-03      400             Null               400

Таким образом, столбцы avg_over_500 и avg_less_500 будут смотреть только результаты предыдущих сыгранных матчей.

Я думал о том, чтобы попробовать код, подобный этому:

select 
  gtr.team_id,
  gtr.match_performance_rating,
  g.avg_pm_opp_over_500,
  g.avg_pm_opp_less_500
from game_team_rating gtr inner join (
  select 
    team_id,
    avg(case when opponent_rating > 500 and gtr.date > date  then match_performance_rating end) avg_pm_opp_over_500,
    avg(case when opponent_rating <= 500 and gtr.date > date  then match_performance_rating end) avg_pm_opp_less_500
  from game_team_rating
  group by team_id  
) g on g.team_id = gtr.team_id

Однако это, очевидно, не работает, потому что нет разделения между датой для сгруппированных значений и для каждой строки.

1 Ответ

0 голосов
/ 17 июня 2019

В MySQL 8+ вы бы использовали оконные функции (доступны в MySQL 8+):

select gtr.*
       avg(case when gtr.opponent_rating > 500 then match_performance_rating end) over
           (partition by gtr.team_id order by gtr.date rows between unbounded preceding and 1 preceding) as pm_over_500,
       avg(case when gtr.opponent_rating < 500 then match_performance_rating end) over
           (partition by gtr.team_id order by gtr.date rows between unbounded preceding and 1 preceding) as pm_under_500
from game_team_rating gtr;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...