【问题标题】:Multi-event tournament standings多项目锦标赛积分榜
【发布时间】:2019-05-20 06:57:31
【问题描述】:

我正在尝试获取多赛事锦标赛的参赛者排名。

我可以很容易地对单个事件进行排名。有没有办法一次性找到 ALL?

Given input: "Bob"


Data example:               Desired output:

Name | Event | Score        Name | Event | Score | Rank
--------------------        ----------------------------
Bob      1     100          Bob      1     100      1    
Bob      2      75          Bob      2      75      3
Bob      3      80          Bob      3      80      2
Jill     2      90
Jill     3      60
Chris    1      70
Chris    2      50
Chris    3     100
Amy      1      85
Amy      2      95
Amy      3      65

问题:我无法访问 Rank() 与我的 SQL 版本一起使用,在这种情况下无法更新。

很明显,我可以在一个循环中分别对每个事件进行评分, 但我想尝试一下子完成所有操作。

【问题讨论】:

  • 排名只是一个序列号不是吗?
  • 它是参与者在活动中的位置。比如第一、第二、第三等等。
  • @Strawberry:事件 3 的 Score 的值为 {80,60,100,65},使 Bob 第二。
  • MySQL 8 之前版本的解决方案...db-fiddle.com/f/xcxcrdsBShWxr4Z8WTzJMS/1
  • 是否可以让它跟踪平局?事实上,如果两个人是第一名,则下面的人被读作排名第二。

标签: mysql group-by ranking


【解决方案1】:

您可以在 MySQL 中模拟排名函数,使用自连接到同一 Event 中得分较高的值,然后计算每个参与者的得分较高的数量:

SELECT s1.Name, s1.Event, s1.Score, COUNT(s2.Name)+1 AS Rank
FROM scores s1
LEFT JOIN scores s2 ON s2.Event = s1.Event AND s2.Score > s1.Score
WHERE s1.Name = 'Bob'
GROUP BY s1.Name, s1.Event, s1.Score
ORDER BY s1.Name, s1.Event

输出:

Name    Event   Score   Rank
Bob     1       100     1
Bob     2       75      3
Bob     3       80      2

Demo on dbfiddle

【讨论】:

    猜你喜欢
    • 2019-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-27
    • 1970-01-01
    • 2017-09-01
    • 2017-05-21
    • 1970-01-01
    相关资源
    最近更新 更多