对分区进行排名并按列分组,我该怎么做?
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.
您需要两个步骤:
- 获取每种游戏类型和玩家得分最高的行。
- 从中获取每种游戏类型得分最高的行。
查询:
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
。
我有一个包含玩家 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.
您需要两个步骤:
- 获取每种游戏类型和玩家得分最高的行。
- 从中获取每种游戏类型得分最高的行。
查询:
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
。