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

时间:2014-05-23 01:30:02

标签: mysql sql excel join case

如何在下面编辑我的查询的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的前两行的平均值。

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

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

id  A     B      C      D       E
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   C                     D                     E
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;

虽然此查询有效,但我想要col E的数字并不完全正确。它们仅适用于id&lt; = 4但不适用于col = 5或id = 6的col E.

我相信ON运算符的CASE语法可能是错误的。

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

ID  A   B   E
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输出是不同的。 谢谢,

1 个答案:

答案 0 :(得分:1)

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

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;

您可以使用基本布尔逻辑表达on

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