【问题标题】:SQL Query - Finding the Rank of a User in a QuizSQL 查询 - 在测验中查找用户的排名
【发布时间】:2021-07-01 13:27:26
【问题描述】:

我的数据库中有一个 QuizAttempt 表,如下所示

| QAID | QID | UID | Score | Time |
| ---- | --- | --- | ----- | ---- |
|   1  |  5  |  3  |  119  |  105 |
|   2  |  5  |  3  |  117  |   70 |
|   3  |  5  |  3  |  119  |   90 |
|   4  |  5  |  4  |  120  |  130 |

其中QAID = 测验尝试 ID,QID = 测验 ID,UID = 用户 ID,Score = 尝试得分,Time = 用时秒数

我想先降序获得基于分数的用户排名,如果分数相同,则升序获得时间。此外,我还必须将参加过一次测验的用户分组并展示他们的最佳尝试。

所以结果应该是这样的(Grouped UID 3)

| QAID | QID | UID | Score | Time |
| ---- | --- | --- | ----- | ---- |
|   4  |  5  |  4  |  120  |  130 |
|   3  |  5  |  3  |  119  |   90 |

我知道我可以应用 Group By UID 然后 Max(Score) 但另外我还必须根据该记录选择时间,但我是否会在 GROUP BY 中选择 119 旁边的最低分数?

因为如果我写

Select QID, UID, Max(Score) as Topper, Min(Time) as MinTime from QuizAttempt 
Group By QID, UID
Order By Topper DESC

我明白了

| QID | UID | Topper | MinTime |
| --- | --- | ------ | ------- |
|  5  |  4  |  120   |   130   |
|  5  |  3  |  119   |   70    |

我得到 70 分,这是总分(时间),属于 得分 117

的记录

如果我试试这个

Select QID, UID, Max(Score) as Topper, Min(Time) as MinTime from QuizAttempt 
Group By QID, UID,Score
Order By Topper DESC

我明白了

| QID | UID | Topper | MinTime |
| --- | --- | ------ | ------- |
|  5  |  4  |  120   |  130    |
|  5  |  3  |  119   |  90     |
|  5  |  3  |  117   |  70     |

我应该如何正确地进行分组?我正在使用 MS SQL Management Studio 2008

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    你可以使用row_number():

    select qa.*
    from (select qa.*,
                 row_number() over (partition by uid order by score desc, time asc) as seqnum
          from QuizAttempt qa
         ) qa
    where seqnum = 1;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-10
      • 1970-01-01
      • 2010-09-17
      相关资源
      最近更新 更多