2013-09-05 2 views
0

이 나를 위해 매우 복잡한 상황을 실행 한 누군가가 나를 도울 수 있는지 궁금 해서요 :사용 지연이

Record_no Type Solde SQLCalculatedPmu DesiredValues 
------------------------------------------------------------------------ 
2570088 Insertion 60   133    133 
2636476 Insertion 67   119,104   119,104 
2636477 Insertion 68   117,352   117,352 
2958292 Insertion 74   107,837   107,837 
3148350 Radiation 73   107,837   107,83 <--- 
3282189 Insertion 80   98,401   98,395 
3646066 Insertion 160   49,201   49,198 
3783510 Insertion 176   44,728   44,725 
3783511 Insertion 177   44,475   44,472 
4183663 Insertion 188   41,873   41,87 
4183664 Insertion 189   41,651   41,648 
4183665 Radiation 188   41,651   41,64 <--- 
4183666 Insertion 195   40,156   40,145 
4183667 Insertion 275   28,474   28,466 
4183668 Insertion 291   26,908   26,901 
4183669 Insertion 292   26,816   26,809 
4183670 Insertion 303   25,842   25,836 
4183671 Insertion 304   25,757   25,751 
: 여기

내 테이블 내 테이블에서

이전 값을 기준으로 SQLCalculatedPmu 열 또는 desiredValue 열 계산의 모든 값.

당신이 볼 수 있듯이

, 나는 3 개 소수에 라운드를 기반으로 SQLcalculatedPMU 열을 계산했다. 경우에 따라 각 라인의 방사선에서 클라이언트는 3 대신 원하는 값 열에 표시된 2 개의 소수점을 기준으로 다음 계산을 시작하려고합니다. 다음 값이 다시 계산됩니다. 예를 들어, 5 행의 값이 2 자리 소수에 오면 6 행이 변경됩니다. 내가 처리 할 수있는이있을 경우 어디에서 하나 개의 방사선하지만 내 경우에는 내가 방사선을 많이 가지고이 경우 그들은 두 소수의 계산에 따라 모든 변경됩니다.

은 요약하면, 다음 단계는 다음과 같습니다

1 - round the value of the preceding row of a raditaiton and put it in the radiation row. 
2 - calculate all next insertion rows. 
3 - when we reach another radiation we redo steps 1 and 2 and so on 

내가 오라클 DB를 사용하고 내가 절차, 삽입, 업데이트, 선택을 할 수 있도록 내가 주인을 해요. 그러나 절차 나 루프에 익숙하지 않습니다.

(price * number)+(cumulative (price*number) of the preceeding lines) 

나는이 같은 시도 :

update PMUTemp 

    set SQLCalculatedPmu = 
    case when Type = 'Insertion' then 
     (number*price)+lag(SQLCalculatedPmu ,1) over (partition by investor 
     order by Record_no)/ 
     (number+lag(solde,1) over (partition by investor order by Record_no)) 
     else 
     TRUNC(lag(SQLCalculatedPmu,1) over partition by invetor order by Record_no)) 
    end; 

내용

,이 SQLCalculatedPmu에 대한 공식은 두 개의 추가 culmns 가격과 번호를 사용하고이 각 투자자 cumulativelly 모든 라인을 계산이다

:

는하지만 나에게이 오류 (내가 자체가 SQL 문 중에 수정 된 preceiding 라인에서 찾고 있어요 있기 때문에 생각)했다 일을 할 것입니다 방사선의 수 많은 시간으로 호출되는 프로 시저를 작성하지만 절차

어떤 도움 감사합니다 정말 좋은 아니에요 경우 궁금 해서요 43,210

,


그냥 내 필요 간단하게하기 위해, 내가 원하는 모두는 SQLCalculatedPmu 열에서 시작 DesiredValues ​​열을하는 것입니다. 테이블의 방사선 행 SQL 업데이트를이 더 빠르고 안정적으로 할 것 - 단계

1 - on a radiation the value become = trunc(preceding value,2) 
2 - calculate all next insertion rows this way : (price * number)+(cumulative (price*number) of the preceeding lines). As the radiation value have changed then I need to recalculate next lines based on it 
3 - when we reach another radiation we redo steps 1 and 2 and so on 

친절한 관련

+1

먼저

뭔가처럼 .. 당신이 TRUNC, 당신은 라운드를하지 않습니다 (107,837'는'107,84' 반올림 될 것'하지'107,83'). 그렇다면 여기에서 직면 한 문제가 무엇인지 이해하지 못합니다 ... – Emmanuel

+0

@Nicholas Krasnov 예를 들어, 107,837 대신에 107,83으로 첫 방사선을 강제합니다. 이 경우이 새로운 숫자이므로 다음 줄은 그 값에 따라 계산되어야하므로 다음 줄에는 98,401 대신 98,395가 표시됩니다.문제는이 방사선도 다음 값에 영향을 미치지 만 다음 방사선도 다음 값에 영향을 미친다는 것입니다. 그래서 나는 첫 번째 복사의 새로운 값과 두 번째 복사의 변화에 ​​대한 값을 기반으로 값을 고정하는 루프를 만들어야합니다. – user2583029

+0

그런데 방사선 값은 이전 값의 2 ~ 10 자릿수에 불과합니다. 따라서 선행 값이 변경되면 방사선 값도 변하고 방사선 값은 모든 다음 값에 영향을 미칩니다. – user2583029

답변

0

현재 절차를 필요가 없습니다 수 있습니다.

update my_table t1 
set (column_1, column_2) = 
     (select round(column_1,2), round(column_2,2) 
     from my_table t2 
     where t2.type  = 'Insertion' and 
       t2.record_no = (select max(t3.record_no) 
           from my_table t3 
           where t3.type  = 'Insertion' and 
             t3.record_no < t1.record_no )) 
where t1.type = 'Radiation' 
+0

안녕하세요, 사실 방사선 행만 변경하는 것이 아닙니다. 다음 단계가 있습니다. 1 - 방사 선행 행의 값을 row 행으로 복사 행에 놓습니다. 2 - 모든 다음 삽입 행을 계산하십시오. 3 - 다른 방사선에 도달하면 1, 2 단계를 반복하고 – user2583029

+0

삽입 행을 계산하는 논리는 무엇입니까? –

+0

가격과 번호라는 두 개의 다른 열이 있습니다. 논리는 처리되는 주문 번호보다 작거나 같은 모든 순서 번호에 대해이 두 값의 누적 배수를 계산하는 것입니다. – user2583029

관련 문제