2014-01-11 59 views
1

我正在尋找在MySQL表中創建一列,以計算另一列的最後五個值的運行方差(或標準偏差,以最容易的爲準)。我目前使用三個變量來訂購數據:ID,日期和計數器(每個ID日期配對計數器從1開始上升)。所以每次新的ID-date組合開始時,我都希望這個新的差異列也重置。這裏是我要去的一點點樣本:在MySQL中創建運行差異列

 
+----+--------+---------+-------+--------------------------+ 
| ID | date | counter | value |  var(value)  | 
+----+--------+---------+-------+--------------------------+ 
| 11 | 1/1/13 |  1 | 2.1 | var(2.1)     | 
| 11 | 1/1/13 |  2 | 2.4 | var(2.1,2.4)    | 
| 11 | 1/1/13 |  3 | 2.3 | var(2.1,2.4,2.3)   | 
| 11 | 1/1/13 |  4 | 2.5 | var(2.1,2.4,2.3,2.5)  | 
| 11 | 1/1/13 |  5 | 2.3 | var(2.1,2.4,2.3,2.5,2.3) | 
| 11 | 1/1/13 |  6 | 2.5 | var(2.4,2.3,2.5,2.3,2.5) | 
| 11 | 1/3/13 |  1 | 5.4 | var(5.4)     | 
| 11 | 1/3/13 |  2 | 4.3 | var(5.4,4.3)    | 
| 11 | 1/3/13 |  3 | 3.4 | var(5.4,4.3,3.4)   | 
| 11 | 1/3/13 |  4 | 2.1 | var(5.4,4.3,3.4,2.1)  | 
+----+--------+---------+-------+--------------------------+ 

有沒有人知道這是如何在MySQL中完成的?我還沒有找到解決任何類似這個問題的問題。

非常感謝!

+0

它可以完成,但它有點工作。讓我們先看看你的一些努力 - 展示一個嘗試。這不是一個編碼服務。 – Bohemian

+0

或者我們只是給你答案 – Strawberry

回答

0

方差是每個值與平均值之差的平方和的平均值。所以,你可以做很多連接和算術。事情是這樣的:使用適當的聚合功能,如VARIANCE()

select t.*, 
     (case when t1.date is null then 0 
      when t2.date is null 
      then (pow(t.value - (t.value + t1.value)/2, 2) + 
        pow(t1.value - (t.value + t1.value)/2, 2))/2 
      when t3.date is null 
      then (pow(t.value - (t.value + t1.value + t2.value)/3, 2) + 
        pow(t1.value - (t.value + t1.value + t2.value)/3, 2) + 
        pow(t2.value - (t.value + t1.value + t2.value)/3, 2) 
       )/3 
      when t4.date is null 
      then (pow(t.value - (t.value + t1.value + t2.value + t3.value)/4, 2) + 
        pow(t1.value - (t.value + t1.value + t2.value + t3.value)/4, 2) + 
        pow(t2.value - (t.value + t1.value + t2.value + t3.value)/4, 2) + 
        pow(t3.value - (t.value + t1.value + t2.value + t3.value)/4, 2) 
       )/4 
      else (pow(t.value - (t.value + t1.value + t2.value + t3.value + t4.value)/5, 2) + 
        pow(t1.value - (t.value + t1.value + t2.value + t3.value + t4.value)/5, 2) + 
        pow(t2.value - (t.value + t1.value + t2.value + t3.value + t4.value)/5, 2) + 
        pow(t3.value - (t.value + t1.value + t2.value + t3.value + t4.value)/5, 2) + 
        pow(t4.value - (t.value + t1.value + t2.value + t3.value + t4.value)/5, 2) 
       )/5 
     end) as var 
from t left outer join 
    t t1 
    on t.date = t1.date and t.counter = t1.counter + 1 left outer join 
    t t2 
    on t.date = t2.date and t.counter = t2.counter + 2 left outer join 
    t t3 
    on t.date = t3.date and t.counter = t3.counter + 3 left outer join 
    t t4 
    on t.date = t4.date and t.counter = t4.counter + 4; 
+0

哇。真?我錯過了什麼嗎? :/ – eggyal

2

您可以自聯接:

SELECT a.*, VARIANCE(b.value) 
FROM  my_table a 
    JOIN my_table b ON b.ID  = a.ID 
        AND b.date  = a.date 
        AND b.counter <= a.counter 
GROUP BY a.ID, a.date, a.counter, a.value 

看到它的sqlfiddle

+0

+1不錯。在 – Bohemian

+0

+1第一次看到這個功能之前還沒碰到過這個agg功能。 –