我有以下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
答案 0 :(得分:1)
您可以通过条件汇总获得这些平均值,并将结果加入表格:
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 |
答案 1 :(得分:0)
使用窗口函数(在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;