2013-06-01 33 views
0

我有一个表格b与百万行。我想更新列result与前面的第n行的值(比如前面的第3行的值)。下面的代码可以以非常高的速度更新result以前一行的值,因为我没有使用join。但是,它不能更新result以前的第3行的值。Mysql:如何使用current-x row的值更新当前行?

set @previousRow = 0.0; 
ALTER TABLE b ADD previousRow Double; 
UPDATE `b` SET `result`[email protected] , 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 

回答

1

我相信你需要N个变量,即3行,你什么'd需要这样的东西:

set @previousRow1 = 0.0,@previousRow2 = 0.0,@previousRow3 = 0.0; 
ALTER TABLE b ADD previousRow Double; 
UPDATE `b` SET `result`[email protected] 
     , @previousRow1 = @previousRow2 
     , @previousRow2 = @previousRow3 
     , @previousRow3 = `x`; 

不确定MySQL中的语法,无法对其进行测试。

当然,在大多数其他DBMS中,您可以使用LEAD/LAG函数,但我不认为MySQL中有一个不涉及连接的解决方案。

+0

是可用的LEAD/LAG功能MS Sql 2003?它比使用变量快吗? –

+0

是否有扩展名,我可以安装,以使MySQL实现概率? –

+0

LEAD/LAG直到MS SQL 2012才出现,他们迟到了派对。我认为MySQL中没有任何方法可以解决连接问题。 –

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

+0

好吧,您已经使用了3个变量,因为问题在于第三个上一行,但是有时如果我想获得前一个第1000行,那么? –

+0

@NokImchen。 。 。有一个自动增加ID并使用连接。 –

+0

我想避免连接,因为它会使查询非常缓慢 –

相关问题