2014-10-09 87 views
0

的平均我有這樣的事情:一個MySQL查詢得到,每每一行,前面的三排

id  | value 
--------------- 
201311 | 10 
201312 | 15 
201401 | 20 
201402 | 5 
201403 | 17 

,我需要這樣一個結果:

201311 | NULL or 0 
201312 | 3.3  // 10/3 
201401 | 8.3  // (15+10)/3 
201402 | 15  // (20+15+10)/3 
201403 | 13.3 // (5+20+15)/3 

到目前爲止,我得到了我可以得到最後三個以前的行的AVG像這樣的點:

select AVG(c.value) FROM (select b.value from table as b where b.id < 201401 order by b.id DESC LIMIT 3) as c 

手動傳遞ID。我無法爲每個ID做到這一點。

任何想法將不勝感激!

非常感謝。

問候

+0

你想要這樣的結果,但爲什麼你的where子句灣ID <201401.請提供有效的結果。 NULL或0從哪裏來? 201311得到價值10即使你平均它不會使它0 – 2014-10-09 09:21:35

+0

我把201401,因爲我無法將每個ID傳遞給該查詢。 NULL或0是因爲我需要前面3行的平均值 – Gotrekk 2014-10-09 09:26:45

+1

Er,25/2 = 12.5 – Strawberry 2014-10-09 09:38:46

回答

0

我得到這個現在:

SELECT a.id, (select AVG(b.value) FROM table as b where b.id < a.id AND str_to_date(CONCAT(b.id,'01'), '%Y%m%d') >= DATE_SUB(str_to_date(CONCAT(a.id,'01'), '%Y%m%d'), INTERVAL 3 MONTH)) FROM `table` as a WHERE 1 

但我敢肯定應該有一個更好/更簡潔的方案

+0

只是試圖在sql小提琴中使用相同的方法。 ROFL。但爲什麼你需要再次限制日期而不是LIMIT? – 2014-10-09 09:48:37

+0

顯然LIMIT是要運行的最後一件事,所以在AVG計算過程中它被忽略:( – Gotrekk 2014-10-09 09:59:00

0

我認爲你必須寫一個存儲過程,使用遊標,通過該表進行迭代,並使用您的遊標循環中計算出的值填充的新表。如果你在編寫光標循環時需要幫助,只需放下一條評論,我可以給你一個例子。

+0

不,謝謝,我真的需要通過查詢來解決它 – Gotrekk 2014-10-09 09:30:09

+0

作爲就我的理解而言,SELECT查詢本質上是一個批處理過程,而您想要的信息需要按特定順序在表上進行迭代,因此需要使用遊標。 – raymondboswel 2014-10-09 12:43:12

0
select a.id,coalesce(b.value,0) from test a left outer join 
(select a.id, sum(b.value)/3 as value from 
(select @row:[email protected]+1 as rownum,id,value from test,(select @row:=0)r) a, 
(select @row1:[email protected]+1 as rownum,id,value from test,(select @row1:=0)r) b 
where b.rownum in (a.rownum-1,a.rownum-2,a.rownum-3) 
group by a.rownum) b 
on a.id=b.id;