【发布时间】:2021-06-21 23:57:42
【问题描述】:
我有一个包含玩家结果/分数的数据库表。 数据如下所示:
| 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;
但是同一个玩家可以多次排名。 我只想要每个游戏类型的每个玩家的最高分。我该怎么做?
数据库是Mysql 8.0。
【问题讨论】:
-
但是同一个玩家可以多次排名。我只想要每种游戏类型的每个玩家的最佳分数。 某些玩家的某些分数可能不是该玩家的最佳分数,而是游戏的最佳分数...您的算法不允许输出此播放器。有可能某些玩家在 2 场比赛中是最好的 - 您的算法不允许了解该球员必须返回哪个游戏。
-
@Akina:看来你对这部分有误解。照原样,玩家可以同时在一种游戏类型中排名前 1、第 2 和第 3,但 frofrik 只想要他们一次(以他们在游戏类型中的最高分)。
-
@ThorstenKettner 如果是这样,那么第一步很简单
GROUP BY player,game并得到MAX(score)。然后排名并获得前 3 名。 -
@Akina:是的。
GROUP BY player_id, game_type就是这样。如果您想要整行,请改用PARTITION BY player_id, game_type和ROW_NUMBER。这就是我在回答中所做的。
标签: mysql sql database mysql-8.0