在SQL中计算滚动摘要统计信息

时间:2016-06-21 08:43:56

标签: sql sql-server

我有一张桌子,假设它包含了学生考试的结果。每个测试都由一名学生完成,他们可以根据需要随时进行测试。源表可能如下所示:

  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术语中,更不用说高效编码了。非常感谢任何帮助!

1 个答案:

答案 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

编辑:由于窗口功能非常高效,因此效率非常高。