0

我有一张有数b百万行的表。我想result用前 n 行的值(比如前 3 行的值)更新列。下面的代码可以 result以非常高的速度更新前一行的值,因为我没有使用过join。但是,它不能 result用前 3 行的值更新。

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
4

2 回答 2

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 中没有不涉及连接的解决方案。

于 2013-06-01T04:31:15.210 回答
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对此进行测试。

于 2013-06-01T06:06:24.070 回答