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
;
我有一个 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
;