2012-03-05 48 views
0

我有一個MySQL表結構如下所示:計算平均每x行與MySQL查詢

timestamp | messageVals 
----------------------- 
1325825203| 46.5 
1325825306| 48 
1325825404| 43.75 
1325825835| 49.625 
1325826003| 49.625 
1325826055| 47.125 
1325794709| 42.875 

等等等等第四,它有超過了2000總行。我想每次計算一組二十個的平均值,並可能會爲平均值添加另一列。因此,每第20行在平均值列中的值將是前20個值的平均值,然後這些值將重新設置並且執行接下來的20個值的平均值。

  timestamp | messageVals | avg 
      -------------------------------- 
      1325825203| 46.5  | 
      1325825306| 48   | 
      1325825404| 43.75  | 
      1325825835| 49.625  | 
      1325826003| 49.625  | 
      1325826055| 47.125  | 
(20th) 1325794709| 42.875  | 47.15 

什麼是最容易理解的查詢,將用平均值填充第三列?

回答

2

我不清楚你是否真的想在你的表中保留平均值或只是在SELECT查詢中計算它們。

假設是後者,你可以做這樣的事情:

set @rownum := 0; 
set @sum := 0; 

select ts,messageVals,the_avg 
from (
    select ts,messageVals, 
    @rownum := (@rownum + 1) as rownum, 
    @sum := IF(@rownum mod 20 = 1,0 + messageVals,@sum + messageVals) as running_sum, 
    IF(@rownum mod 20 = 0,@sum/20,NULL) as the_avg 
    from so9571582 
    order by ts 
) s; 
+0

我想將它們插入到表中。需要進行哪些修改才能這樣做。 – 2012-03-05 23:51:35

+0

我想你可以使用存儲過程來設置每20行的平均值。您可以選擇avg列中具有非空值的最高時間戳,然後使用遊標對具有更高時間戳的行進行迭代,並在每20行設置一次avg。它不是很乾淨,但如果這真的是你想要做的,你可以使它工作。 – 2012-03-06 00:36:30