题目
数据
结果
解答
1.因为分了两场,所以把两场连接为一场
select first_player player_id,first_score score from matches #
union all
select second_player player_id,second_score score from matches
2. 连接players表,按组别和玩家 分组计算得分
select group_id,players.player_id,sum(score) score1
from players
right join(
select first_player player_id,first_score score from matches #
union
select second_player player_id,second_score score from matches
) a
on a.player_id = players.player_id
group by group_id,player_id
order by group_id
3.按照组别分组,按分数排名(排名的时候,按照分数和用户id排名)!!!!!!
select group_id,player_id,score1,
rank() over (partition by group_id order by score1 desc,player_id) rn
from(
select group_id,players.player_id,sum(score) score1
from players
right join(
select first_player player_id,first_score score from matches #
union
select second_player player_id,second_score score from matches
) a
on a.player_id = players.player_id
group by group_id,player_id
order by group_id
) b
4.筛选出来第一名的人,(按照分数和id)
select group_id,player_id ,rn
from(
select group_id,player_id,score1,
rank() over (partition by group_id order by score1 desc,player_id) rn
from(
select group_id,players.player_id,sum(score) score1
from players
right join(
select first_player player_id,first_score score from matches #
union
select second_player player_id,second_score score from matches
) a
on a.player_id = players.player_id
group by group_id,player_id
order by group_id
)b
)c
where rn = 1