使用CASE进行MySQL移动平均计算

我如何编辑我的查询下面的ON运算符部分,使我想当前的代码工作,其中id <4(这是t2.id <= t1.id如下所示),所以当t1 id = 3,t2是从id = 1到id = 3(如现在)的累积ID。

但是对于id> 3,我希望ON运算符是(t2.id = t1.id> = t1.id-2和<= t1.id),所以当t1 id = 4时,t2.id应该在2和4包括在内。 当t1 id = 5时,t2.id应该在3和5之间,依此类推。

我这样做是因为当我计算ID = 3后ID为col E,我只是感兴趣的移动平均C和D的前2行的平均值。

Iam将我的Excel公式转换成SQL,所以我知道col E的正确值是什么。

我的查询有2个子查询,它更新列E. EXCEL中的表和正确的数据如下所示:

id ABCDE 1 NULL NULL NULL NULL NULL 2 4 6 1 1 1 3 6 9 1.2 1.2 1.2 4 8 7 1.33 0.954 1.143 5 10 5 1.25 0.714 0.982 6 12 2 1.2 0.428 0.814 

http://www.sqlfiddle.com/#!2/17a0ad/1

EXCEL公式(请注意公式在id = 3之后改变为移动平均值):

 id CDE 2 =A2/AVERAGE(A1:A2) =B2/AVERAGE(B1:B2) =(C2+D2)/2 3 =A3/AVERAGE(A1:A3) =B3/AVERAGE(B1:B3) =(C3+D3)/2 4 =A4/AVERAGE(A2:A4) =B4/AVERAGE(B2:B4) =(C4+D4)/2 5 =A5/AVERAGE(A3:A5) =B5/AVERAGE(B3:B5) =(C5+D5)/2 6 =A6/AVERAGE(A4:A6) =B6/AVERAGE(B4:B6) =(C6+D6)/2 

这是我的SQL查询:

 Update followers join ( SELECT t1.id ,ifnull(t1.A/AVG(t2.A),null) C ,ifnull(t1.B/AVG(t2.B),null) D FROM followers t1 JOIN followers t2 ON case when t2.id < 4 then t2.id <= t1.id else t2.id<= t1.id and t2.id>=t1.id-2 end group by t1.id ) AS tt on(followers.id = tt.id) SET E = (tt.C + tt.D)/2; 

虽然这个查询工作,我想要列E的数字不完全正确。 它们对于id <= 4是正确的,而对于col E中的id = 5或id = 6不是。

我相信我的操作符的CASE的语法可能是错误的。

我在SQL小提琴中运行这个查询,并得到这个结果:

 ID ABE 1(null)(null)(null) 2 4 6 1 3 6 9 1.2 4 8 7 1.14 5 10 5 1.08 6 12 2 0.92 

我们可以看到,excel和sql的输出是不同的。 谢谢,

我认为你想要的查询是一个非常微小的修改:

 Update followers join (SELECT t1.id, ifnull(t1.A/AVG(t2.A),null) as C, ifnull(t1.B/AVG(t2.B),null) as D FROM followers t1 JOIN followers t2 ON (case when t1.id < 4 then t2.id <= t1.id ----------------------------^ else t2.id<= t1.id and t2.id>=t1.id-2 end) group by t1.id ) tt on followers.id = tt.id SET E = (tt.C + tt.D)/2; 

你可以使用基本的布尔逻辑来expression:

 on t2.id <= t1.id and (t1.id < 4 or t2.id >= t1.id - 2)