Mysql:如何使用current - x row的值更新当前行?

时间:2013-06-01 02:45:03

标签: mysql sql

我有一张表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

2 个答案:

答案 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进行测试。