这是本委员会已经回答的问题的第2部分。再次感谢peterm!
所以我的代码将返回给定学生的前3个考试成绩。我的表如下所示:
学生ID,考试ID,分数
1,1,95
1,2,90
1,3,7,9
1,4,70
2,1,91
2,2,95
2,3,7,9
2,4,8,9
感谢peterm,我有以下代码可以帮我这样做:
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;
我的新问题现在我需要在主题和年份的表格中添加两个新字段,因此我需要找到每个学科 - 学生 - 年组合的前3个分数。一旦我得到每个组合的前三个分数,我需要对它们进行平均,这样我将得到每个学生 - 主题 - 年组合的前3个分数的平均分数。希望我能够清楚地解释这一点,而不必嘲笑另一张桌子。
提前致谢。
答案 0 :(得分:5)
你可以做这样的事情
SELECT StudentID, Year, Subject, AVG(TestScore) AS AvgScore
FROM
(
SELECT StudentID, Year, Subject, TestScore
FROM MyTable t
WHERE TestID IN
(
SELECT TOP 3 TestID
FROM MyTable
WHERE StudentID = t.StudentID
AND Year = t.Year
AND Subject = t.Subject
ORDER BY TestScore DESC, TestID
)
) q
GROUP BY StudentID, Year, Subject
ORDER BY StudentID, Year, Subject;
示例输出:
| STUDENTID | YEAR | SUBJECT | AVGSCORE | |-----------|------|---------|----------| | 1 | 2012 | 1 | 91 | | 1 | 2012 | 2 | 84 | | 2 | 2012 | 1 | 94 | | 2 | 2012 | 3 | 95 |
以下是 SQLFiddle 演示 演示通常适用于SQL Server,但预计可以在MS Access中运行,可能需要进行少量的语法调整