对分区进行排名并按列分组,我该怎么做?

Rank over partition and group by column, how can I do it?

我有一个包含玩家 results/scores 的数据库 table。 数据如下所示:

player_id result_date score game_type
1 2020-03-01 154 1
2 2020-03-15 171 2
3 2020-03-15 122 1
2 2020-03-17 210 2
1 2020-04-01 190 2
2 2020-05-15 125 1
1 2020-06-01 167 1
2 2020-06-10 173 1

我想获得每种游戏类型的前三名玩家,并且还可以过滤日期,但我不知道该怎么做。

目前我的查询如下所示:

SELECT rr.* FROM 
(SELECT game_type, player_id, result_date, score,
RANK() OVER (partition by game_type ORDER BY score DESC) as game_rank
FROM results
WHERE result_date >= '2020-01-01') rr
HAVING game_rank <= 3;

但是同一个玩家可以多次排名。 我只想要每种游戏类型的每个玩家的最佳分数。我该怎么做?

数据库是Mysql8.0.

您需要两个步骤:

  1. 获取每种游戏类型和玩家得分最高的行。
  2. 从中获取每种游戏类型得分最高的行。

查询:

select 
  game_type, player_id, result_date, score
from
(
  select
    game_type, player_id, result_date, score,
    dense_rank() over (partition by game_type order by score desc) as game_rank
  from 
  (
    select 
      game_type, player_id, result_date, score,
      row_number() over (partition by game_type, player_id order by score desc) as rn
    from results
    where result_date >= date '2020-01-01'
  ) top_games
  where rn = 1
) top_players
where game_rank <= 3
order by game_type, score desc;

如果一位玩家在超过一个日期的一种游戏类型中得分最高,则使用 ROW_NUMBER 任意选择一个。至于玩家,我们还要考虑平局,决定是用RANK还是DENSE_RANK。我在查询中使用 DENSE_RANK