MS Access选择按多个字段分组的前n个查询

时间:2014-01-11 06:00:58

标签: sql ms-access

这是本委员会已经回答的问题的第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个分数的平均分数。希望我能够清楚地解释这一点,而不必嘲笑另一张桌子。

提前致谢。

1 个答案:

答案 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中运行,可能需要进行少量的语法调整