这是我的第一篇文章,所以希望我没有违反任何规则。
我是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提供了此代码。我试图评论那个帖子,但由于我没有任何声望点,所以我没有评论。
答案 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上进行了测试,无需任何修改即可正常运行。