2016-08-31 2 views
0

예 :MySQL : 레코드의 각 날짜의 처음 5 개 레코드를 기반으로 한 열을 평균하는 방법은 무엇입니까?

소스 열, fld_daily_val 있습니다

테이블 이름을 fld_date : tbl_five_days_avg

id fld_daily_val fld_date 

1 3.3658974569  2016-02-01                     
2 2.215478659  2016-02-02                
3 1.25984453412 2016-02-03            
4 0.2589631477  2016-02-04              
5 9.2587894561  2016-02-05                           
6 7.2587415935  2016-02-06              
7 6.589789789  2016-02-07               
8 5.3654951357  2016-02-08 

출력 열 이름은 fld_five_days_avg입니다. 출력은 다음과 같습니다.

id fld_daily_val fld_date  fld_five_days_avg 

1  3.3658974569  2016-02-01 3.3658974569 --No data before this date.                 
2  2.215478659  2016-02-02 2.79068805795000 --id(1+2)/2                   
3  1.25984453412 2016-02-03 2.280406883340000 --id(1+2+3)/3                  
4  0.2589631477  2016-02-04 1.775045949430000 --id(1+2+3+4)/4                   
5  9.2587894561  2016-02-05 3.271794650764000 --id(1+2+3+4+5)/5 
6  7.2587415935  2016-02-06 7.2587415935 --should consider this is the first record after five record average completed.                
7  6.589789789  2016-02-07 6.92426569125000 --id(6+7)/2              
8  5.3654951357  2016-02-08 6.40467550606667 --id(6+7+8)/3 

지식을 개선하는 데 도움이됩니다. 미리 감사드립니다

감사합니다,

+3

가능한 [SQL의 날짜 범위에서 이동 평균을 수행하는 방법] (http://stackoverflow.com/questions/13280677/how-to-do-a-moving-average-on-a-) date-in-sql) –

+0

Dave가 가능하다고 생각합니다. 소중한 제안을하십시오. – Logu

+0

나는 그것이 가능하다는 것을 안다. 내 의견에 링크 된 게시물은 정확히 어떻게 완료되었는지 보여줍니다. –

답변

2

이 밖으로 시도 :

SELECT 
    id, 
    fld_daily_val, 
    fld_date, 
    @idcount:=CASE 
     WHEN @idcount = 5 THEN 1 
     ELSE @idcount + 1 
    END, 
    (@sumavg:=CASE 
     WHEN @idcount = 1 THEN fld_daily_val 
     ELSE fld_daily_val + @sumavg 
    END)/@idcount fld_five_days_avg 
FROM 
    (SELECT @idcount :=0, @sumavg := 0.0) a, 
    tbl_five_days_avg; 

출력 :

1 3.365897456900000 2016-02-01 1 3.3658974569 
2 2.215478659000000 2016-02-02 2 2.7906880579499997 
3 1.259844534120000 2016-02-03 3 2.28040688334 
4 0.258963147700000 2016-02-04 4 1.77504594943 
5 9.258789456100000 2016-02-05 5 3.271794650764 
6 7.258741593500000 2016-02-06 1 7.2587415935 
7 6.589789789000000 2016-02-07 2 6.92426569125 
8 5.365495135700000 2016-02-08 3 6.404675506066667 

업데이트 논리를 들어

SELECT 
    id, 
    fld_daily_val, 
    fld_date, 
    @idcount:[email protected] + 1, 
    @firstval:[email protected], 
    @secondval:[email protected], 
    @thirdval:[email protected], 
    @fourthval:[email protected], 
    @fifthval:=fld_daily_val, 
    (@firstval + @secondval + @thirdval + @fourthval + @fifthval)/(CASE 
     WHEN @idcount > 5 THEN 5 
     ELSE @idcount 
    END) fld_five_days_avg 
FROM 
    (SELECT 
     @idcount:=0, 
      @firstval:=0.0, 
      @secondval:=0.0, 
      @thirdval:=0.0, 
      @fourthval:=0.0, 
      @fifthval:=0.0 
    ) a, 
    tbl_five_days_avg; 
+0

ORDER BY 절이 필요합니다. – Strawberry

+0

@Logu, thanks 업데이트 :! –

+0

@ 제임스,이 – Logu

관련 문제