Создать 2 столбца для 2 разных групп по функциям в одной таблице - PullRequest
0 голосов
/ 16 июня 2019

У меня есть следующая таблица mysql:

team_id match_performance_rating    opponent_rating
1          500                    700
1          400                    625
2          600                    400
3          500                    525
2          400                    200

Я хочу иметь возможность измерять средний рейтинг производительности для каждой команды (от 1 до 3) в зависимости от того, столкнулся ли он с противником с рейтингом> 500или меньше 500 и сравните это с match_performance_rating.Поэтому я бы сравнил значение строки со значением предложения group by.

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

 team_id match_performance_rating  avg_pm_opp_over_500 avg_pm_opp_less_500
    1          500                    450                Null
    1          400                    450                Null
    2          600                    Null               500
    3          500                    500                Null
    2          400                    Null               500

Я пытался сделать какой-то типзапрос объединения, но он не создает дополнительный столбец:

select team_id, pm,pm2 from
(
select team_id,avg(match_performance_rating) as pm
from game_team_rating gtr
where gtr.opponent_rating > 500
group by team_id
union

select team_id as t2,avg(match_performance_rating) as pm2
from game_team_rating gtr
where gtr.opponent_rating < 500
group by team_id) as q

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Вы можете получить эти средние значения с помощью условного агрегирования и объединить результаты в таблицу:

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 then match_performance_rating end) avg_pm_opp_over_500,
    avg(case when opponent_rating <= 500 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

См. demo .Результаты:

| team_id | match_performance_rating | avg_pm_opp_over_500 | avg_pm_opp_less_500 |
| ------- | ------------------------ | ------------------- | ------------------- |
| 1       | 500                      | 450                 |                     |
| 1       | 400                      | 450                 |                     |
| 2       | 600                      |                     | 500                 |
| 3       | 500                      | 500                 |                     |
| 2       | 400                      |                     | 500                 |
0 голосов
/ 16 июня 2019

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

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