我有一张桌子,假设它包含了学生考试的结果。每个测试都由一名学生完成,他们可以根据需要随时进行测试。源表可能如下所示:
TestID StudentID Pass Score
-------- ----------- ------ -------
1 1 0 4
2 1 0 6
3 2 1 8
4 1 1 9
5 1 0 2
每次进行测试时,我都要计算该学生所有之前结果的摘要统计信息。这就是结果表的样子(尾部):
TestID StudentID Times Taken AvPass AvScore
-------- ----------- ------------- -------- ---------
4 1 2 0 5
5 1 3 .33 6.33
我不知道如何将它放在SQL术语中,更不用说高效编码了。非常感谢任何帮助!
答案 0 :(得分:4)
我相信Tim Biegeleisen的答案并不完全是问题所指的,因为它缺乏“滚动摘要”部分。我得到了你想要的结果:
SELECT TestId, StudentId, COUNT(*) as TimesTaken
, ISNULL(AVG(CAST(Pass as decimal)) OVER (PARTITION BY StudentID ORDER BY TestId ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) as AvPass
, ISNULL(AVG(CAST(Score as decimal)) OVER (PARTITION BY StudentID ORDER BY TestId ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), 0) as AvScore
FROM dbo.RollingSummary
GROUP BY TestId, StudentId, Pass, Score
ORDER BY TestId, StudentId
结果:
TestId StudentId TimesTaken AvPass AvScore
1 1 1 0.000000 0.000000
2 1 1 0.000000 4.000000
3 2 1 0.000000 0.000000
4 1 1 0.000000 5.000000
5 1 1 0.333333 6.333333
编辑:由于窗口功能非常高效,因此效率非常高。