mysql:我如何找到每一行具有最高值从另一列?[重复]

kcugc4gi  于 5个月前  发布在  Mysql
关注(0)|答案(1)|浏览(73)

此问题在此处已有答案

Fetch the rows which have the Max value for a column for each distinct value of another column(35个答案)
Retrieving the last record in each group - MySQL(34个答案)
24天前关闭。
我有一个数据库,里面有几个表,里面有我和朋友玩的游戏的分数和其他统计数据。
我想找到赢家(最高分)的每一场比赛的基础上,无论我们正在寻找的Map名称。
两个相关的表格如下所示(大幅缩减):

matches:
+----------------+---------+
| match_id       | mapname |
+----------------+---------+
| 20200828205505 | jul16   |
| 20200909214044 | jul16   |
| 20200909214901 | jul16   |
| 20200917233839 | jul16   |
| 20200923225809 | jul16   |
+----------------+---------+
players:
+----------------+-----------------+-------+
| match_id       | player_name     | score |
+----------------+-----------------+-------+
| 20200917233839 | Player1         |    11 |
| 20200917233839 | Player2         |    25 |
| 20200923225809 | Player2         |    27 |
| 20200923225809 | Player3         |    19 |
| 20200923225809 | Player1         |    15 |
+----------------+-----------------+-------+

字符串
在matches中,match_id是唯一的(它只是日期),但是对于给定的match_id,玩家显然会有多行。
因此,对于给定的mapname,我想找到每个match_id,并且只检索在每个match_id中得分最高的player_name,例如,每场比赛的赢家。使用上面的方法,Player 2赢得了两场比赛。最终,我试图得到每个玩家在给定Map中的获胜总数。
简而言之,根据jul 16的Map,如果我有5个match_id,我希望每个都能得到最高分。我已经尝试了一些joins的方法,但我不知道如何找到(最高分数)。我希望这可以在一次选择中完成,这样我就不必手动编写代码了/如果我做错了,我很想知道其他的选择!
所有的帮助都非常感谢。
我能得到的最接近的结果是使用join语句,但它只给我一个结果(限制为1),而不是示例中的五个匹配。

8cdiaqws

8cdiaqws1#

您可以通过使用ROW_NUMBER()窗口函数和公共表表达式(CTE)的组合来实现这一点,以便在每场比赛中对球员的得分进行排名。

WITH RankedPlayers AS (
  SELECT
    match_id,
    player_name,
    score,
    ROW_NUMBER() OVER (PARTITION BY match_id ORDER BY score DESC) AS rank
  FROM
    players
)
SELECT
  m.match_id,
  m.mapname,
  rp.player_name,
  rp.score
FROM
  matches m
  JOIN RankedPlayers rp ON m.match_id = rp.match_id AND rp.rank = 1
WHERE
  m.mapname = 'jul16';

字符串
此查询将给予您指定Map上每场比赛的赢家(最高得分者)。如果您想获得特定Map上每个玩家的总获胜次数,则可以进一步汇总结果。

相关问题