2016-06-21 4 views
0

테이블이 있습니다. 학생이 수행 한 테스트 결과가 있다고 가정 해 봅시다. 모든 시험은 한 학생이 끝내고, 그들이 원하는만큼 자주 시험을 치를 수 있습니다. 소스 테이블은 다음과 같습니다SQL에서 롤링 요약 통계 계산

테스트 촬영 때마다 들어
TestID StudentID Pass Score 
-------- ----------- ------ ------- 
    1  1   0  4  
    2  1   0  6  
    3  2   1  8  
    4  1   1  9  
    5  1   0  2  

, 나는 그 학생의 모든 이전 결과에 대한 요약 통계를 계산합니다. 내가 어떻게 SQL 기간에 넣고하는 아무 생각이

TestID StudentID Times Taken AvPass AvScore 
-------- ----------- ------------- -------- --------- 
    4  1   2    0  5   
    5  1   3    .33  6.33  

, 효율적으로 코딩 커녕 :이 결과 테이블은 다음과 같은 형태가 될 것이다 (꼬리)입니다. 어떤 도움을 주셔서 감사합니다!

+1

어떤 버전의 SQL Server입니까? 2012 년에는 AVG (Score) OVER (StudentID Order by Participation by TestId by UnbOUNDED PRECEDING와 1 PRECEDING 사이의 차이점)를 지원합니다. – dnoeth

+0

유망한 것으로 보입니다. '무제한 양육과 1 양육의 관계'는 정확히 무엇입니까? 날짜 순서가 맞습니까? –

+0

주문할 때 _some_ 열만 있으면되므로 잘 작동합니다. –

답변

4

Tim Biegeleisen의 답변은 'rolling summary'부분이 없어서 질문에 언급 된 내용과 정확히 일치하지 않는다고 생각합니다.

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 

편집 난 당신이 다음에 찾아 결과를 얻었다.

+0

예! 정말 고맙습니다. 정말 고마워요. –

+0

환영합니다. :) –