在 SQL 中查找比赛的获胜者

Posted

技术标签:

【中文标题】在 SQL 中查找比赛的获胜者【英文标题】:Finding winners of races in SQL 【发布时间】:2021-08-04 20:43:19 【问题描述】:

我有一张表格,上面有用户参加不同比赛的结果。 在每场比赛中表现得分最高的人是每场比赛的获胜者。 所以在下面的例子中,Alice 赢了 0 场,Bob 赢了 1 场,Chris 赢了 2 场。

我需要的是能够为给定用户计算他/她在他/她参加的所有比赛中赢得了多少胜利,以及另一个数量的领奖台结果(第一名或第三名)。

这甚至可以单独使用 SQL 吗?我正在使用 mysql

附:我不知道为什么表格没有正确呈现,它在预览中看起来很完美,所以如果有人能修复它,非常感谢。

RaceID UserID Performance
1 Alice 90
1 Bob 100
2 Alice 100
2 Bob 90
2 Chris 110
3 Alice 90
3 Bob 80
3 Chris 150

【问题讨论】:

ROW_NUMBER() 在 CTE 中并在外部查询中聚合。另一方面 - 如果 2 个用户具有相同的最大性能怎么办? 【参考方案1】:

您可以使用NOT EXISTS 获取每个用户的获胜行并将它们相加:

SELECT t1.UserID,
       SUM(NOT EXISTS(SELECT 1 FROM tablename t2 WHERE t2.RaceID = t1.RaceID AND t2.Performance > t1.Performance)) wins
FROM tablename t1
GROUP BY t1.UserID

如果您的 MySql 版本是 8.0+,您可以使用 MAX() 窗口函数和聚合:

SELECT UserID, 
       SUM(Performance = max_performance) wins
FROM (
  SELECT *, MAX(Performance) OVER (PARTITION BY RaceID) max_performance
  FROM tablename
) t
GROUP BY UserID

请参阅demo。

【讨论】:

谢谢@forpas - 很好的解决方案,也很高兴添加演示

以上是关于在 SQL 中查找比赛的获胜者的主要内容,如果未能解决你的问题,请参考以下文章

SQLite - 获得每场比赛的获胜者(分区排名)

LeetCode:Database 66.锦标赛优胜者

仅根据同一场比赛的先前数据预测足球比赛的获胜者

在锦标赛中可能获胜的算法

为啥热门比赛的获胜者不使用旋转不变神经网络?

如何使用 SQL 从每个组中获得最高得分球员?