oracle SQL使用update将值复制到前导行

时间:2016-10-24 16:59:13

标签: sql oracle performance propagation

我拥有一张拥有数百万条记录的桌子。我有一些记录需要复制到下一行值。 EG:表A具有以下列(A,B,C,D,E,F) 如果源值类似于

A   B   C   D   E   F
1   1-Jan   1   abcd    1-Jan   abcde
2   1-Feb   0   abcd    1-Feb   def
3                               ghi
4                               jkl
5                               mno
6                               pqr
7                               stu
8                               xyz
9                               defg

我必须以下列方式将这些值粘贴到前导行。 如果即使与第1行具有相同的值,如果它与row2的奇数相同,我试图更新下一行。

A   B       C     D      E
1   1-Jan   1   abcd    1-Jan
2   1-Feb   0   abcd    1-Feb
3   1-Jan   1   abcd    1-Jan
4   1-Feb   0   abcd    1-Feb
5   1-Jan   1   abcd    1-Jan
6   1-Feb   0   abcd    1-Feb
7   1-Jan   1   abcd    1-Jan
8   1-Feb   0   abcd    1-Feb
9   1-Jan   1   abcd    1-Jan

使用简单的更新命令来执行此操作。这需要很长时间,因为实际表有超过1000万条记录,并且操作在10列上执行。

有没有什么方法可以更快地将值传播到下一行?

1 个答案:

答案 0 :(得分:1)

只要A包含相邻的值,那就应该这样做。 如果不是这种情况,请使用row_number() over (order by A)作为第一步并相应地更改查询。

理论上NTH_VALUE应该更合适,但我怀疑它有一个错误。

select    A
         ,lag (B,floor((A-1)/2)*2) over (order by A)  as B
         ,lag (C,floor((A-1)/2)*2) over (order by A)  as C
         ,lag (D,floor((A-1)/2)*2) over (order by A)  as D
         ,lag (E,floor((A-1)/2)*2) over (order by A)  as E

from      t
;

N行的一般情况是

select    A
         ,lag (B,floor((A-1)/N)*N) over (order by A)  as B
         ,lag (C,floor((A-1)/N)*N) over (order by A)  as C
         ,lag (D,floor((A-1)/N)*N) over (order by A)  as D
         ,lag (E,floor((A-1)/N)*N) over (order by A)  as E

from      t
;