具有重复值的MS Access Max和Select top n查询问题

时间:2013-12-29 06:42:41

标签: sql ms-access max

这是我的第一篇文章,所以希望我没有违反任何规则。

我是MS Access新手,我的sql知识充其量也是有限的。我正在尝试编写一个查询,该查询将返回给定学生的前三个测试分数。我的表格如下:

Student ID    Test ID      Score
1                1           95
1                2           90
1                3           90
1                4           90
2                1           99
2                2           95
2                3           90
2                4           90

通过对这个论坛的研究,我已经能够找到一些非常有用的代码,基本上我正在寻找的东西除了我有多个相同值的测试分数。在那种情况下,我得到的不仅仅是前三名。所以在学生#1的情况下,查询将返回所有4个测试分数,而不仅仅是前3个。我尝试添加一个唯一的索引字段来排序,但没有运气。到目前为止,我的代码如下:

SELECT MyTable.StudentID, MyTable.TestID, Max(MyTable.TestScore) AS MaxOfTestScore
FROM MyTable
GROUP BY MyTable.StudentID, MyTable.TestID, MyTable.TestScore
HAVING MyTable.TestScore In (SELECT TOP 3 TestScore FROM MyTable T2 WHERE 
MyTable.StudentID = T2.StudentID ORDER BY TestScore DESC)
ORDER BY MyTable.StudentID, MyTable.TestScore DESC;

到目前为止,Sarkazein提供了此代码。我试图评论那个帖子,但由于我没有任何声望点,所以我没有评论。

1 个答案:

答案 0 :(得分:2)

你在找这样的东西吗?

SELECT StudentID, TestID, TestScore
  FROM MyTable t
 WHERE TestID IN
(
  SELECT TOP 3 TestID 
    FROM MyTable
   WHERE StudentID = t.StudentID 
   ORDER BY TestScore DESC, TestID
)
 ORDER BY StudentID, TestScore DESC, TestID;

输出:

| STUDENTID | TESTID | TESTSCORE |
|-----------|--------|-----------|
|         1 |      1 |        95 |
|         1 |      2 |        90 |
|         1 |      3 |        90 |
|         2 |      1 |        99 |
|         2 |      2 |        95 |
|         2 |      3 |        90 |

这是 SQLFiddle 演示。 适用于SQL Server,但我认为应该适用于MS Access

更新它已在MS Access上进行了测试,无需任何修改即可正常运行。

Results in MS Access