如何在下面编辑我的查询的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输出是不同的。 谢谢,
答案 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)