2016-10-24 12 views
1

수백만 개의 레코드가있는 테이블이 있습니다. 다음 레코드 값으로 복사해야하는 레코드가 있습니다. EG : I는 다음과 같이 선두 행에 대한 값들을 복사하여 붙여해야 oracle SQL에서 update를 사용하여 값을 맨 앞줄로 복사

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 

같이 표 A는 데 followingcolumns의 (A, B, C, D, E, F) 소스 값하다면이다. 여기에 행 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 

간단한 업데이트 명령을 사용하여 iam을 수행합니다. 실제 테이블에 1,000 만 개가 넘는 레코드가 있고 작업이 10 개의 열로 수행되기 때문에 시간이 오래 걸립니다.

값을 다음 행으로 훨씬 빨리 전파 할 수있는 방법이 있습니까?

+0

덕분에 내가 테이블 형식 – waiting

+0

당신이 당신의 업데이트 쿼리를 표시하거나 설명 할 수 업데이트하고 있었다 매트 것이 더 나은 데이터를 업데이트 할 수있는 패턴은 무엇인가? 홀수 행을 값으로 업데이트한다고했지만 어떻게 정렬됩니까? – Kacper

+0

p.s. 이것은 끔찍한 디자인입니다. 나는 결과 정보가 정확하다는 것을 결코 믿지 않을 것입니다. 당신이 원하는대로이 업데이트를 얻는다고해도 말이죠. – Randy

답변

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 
; 
+0

지연이 올바르다. 방향과 관련이 있습니다. 가치가있는 2 레코드의 샘플 데이터가 실생활에 있는지 여부가 명확하지 않으므로 수정해야 할 수도 있습니다. – Randy

+0

@ waiting, 이는 사용자의 필요에 부합합니까? –

+0

예 Dudu Markovitz가 작동했습니다 .. 감사합니다. – waiting