我有一张表b
,有数百万行。我想用前一个第n行的值更新列result
(比如前三行的值)。由于我没有使用result
,下面的代码可以以非常高的速度更新join
前一行的值。但是,它无法使用之前的第3行值更新result
。
set @previousRow = 0.0;
ALTER TABLE b ADD previousRow Double;
UPDATE `b` SET `result`=@previousRow , previousRow = @previousRow:=`x`;
ALTER TABLE b DROP previousRow;
上面的查询以非常高的速度执行此操作:
id, x, result
1 , 4, 0.0
2 , 6, 4
3 , 5, 6
4 , 6, 5
5 , 5, 6
6 , 3, 5
7 , 2, 3
我想做什么
id, x, result
1 , 4, null
2 , 6, null
3 , 5, null
4 , 6, 4
5 , 5, 6
6 , 3, 5
7 , 2, 6
8 , 7, 5
9 , 9, 3
答案 0 :(得分:1)
我相信你需要N个变量,即3行,你需要这样的东西:
set @previousRow1 = 0.0,@previousRow2 = 0.0,@previousRow3 = 0.0;
ALTER TABLE b ADD previousRow Double;
UPDATE `b` SET `result`=@previousRow1
, @previousRow1 = @previousRow2
, @previousRow2 = @previousRow3
, @previousRow3 = `x`;
不完全确定MySQL中的语法,目前无法测试。
当然在大多数其他DBMS中你可以使用LEAD / LAG函数,我认为MySQL中没有一个不涉及连接的解决方案。
答案 1 :(得分:1)
以下代码适用于MySQL:
create table b (id int, x int, result int);
insert into b(id, x)
select 1 , 4 union all
select 2 , 6 union all
select 3 , 5 union all
select 4 , 6 union all
select 5 , 5 union all
select 6 , 3 union all
select 7 , 2;
set @prev1 = NULL;
set @prev2 = NULL;
set @prev3 = NULL;
alter table b add col int;
update b
set result = @prev3,
col = (@prev3 := @prev2),
col = (@prev2 := @prev1),
col = (@prev1 := x);
alter table b drop col;
您可以在SQLFiddle进行测试。