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

oracle SQL to Copy value to leading rows using update

我有一个 table 有数百万条记录。我有一些需要复制到下一行值的记录。 例如:Table 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 行具有相同的值,如果它与第 2 行为奇数,我会尝试更新下一行。

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

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

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

只要 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
;