【发布时间】:2014-05-23 01:30:02
【问题描述】:
我如何编辑下面查询的 ON 运算符部分,以便我希望当前代码在 id
但对于 id >3 我希望 ON 运算符为 (t2.id=t1.id>=t1.id-2 和
我这样做是因为当我为 id=3 之后的 id 计算 col E 时,我只对获取 C 和 D 的前 2 行的移动平均值感兴趣。
我正在将我的 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
我相信我的 ON 运算符对 CASE 的语法可能是错误的。
我在 sql fiddle 中运行了这个查询并得到了这个结果:
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 的输出是不同的。 谢谢,
【问题讨论】: