这是我的第一篇文章,希望我没有违反任何规则。
我是MS Access新手,我的SQL知识充其量是有限的。我正在尝试编写一个查询,该查询将返回给定学生的前3个测试成绩。我的表如下所示:
学生证考试ID分数 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都提供了此代码。我试图对此线程发表评论,但由于我没有任何声誉得分而无法发表评论。
您是否正在寻找这样的东西?
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;
输出:
| 学生 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上进行了测试,并且可以按预期工作,而无需进行任何修改。