2016-08-31 5 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- диапазон-даты-в-sql) –

+0

Я думаю, что это возможно Дэйв. Пожалуйста, дайте свое ценное предложение. – 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 

Обновленную Logic

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

. Вывод точно так же необходим Logu, но с небольшими изменениями точности. –

+0

Я думаю, вам нужно предложение ORDER BY – Strawberry

+0

@Logu, thanks для обновления! :) –

 Смежные вопросы

  • Нет связанных вопросов^_^