在 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 中查找比赛的获胜者的主要内容,如果未能解决你的问题,请参考以下文章